Commit 637bbf9cca9d0407e15e5f0ea5f19715b96bca3d

Authored by lxf
1 parent 7bce5260

fix: 货源

common/api.js
... ... @@ -150,6 +150,8 @@ module.exports = (vm) => {
150 150 modifyGoods: params => vm.$u.http.post( freightAPI + '/freightOrder/maModifyGoods', params), // 更改货物信息
151 151 adjustAmount: params => vm.$u.http.post( freightAPI + '/freightOrder/maAdjustAmount', params), // 更改运费
152 152 modifyReceiptAttachment: params => vm.$u.http.post( freightAdmin + '/woss/freightOrder/modifyReceiptAttachment', params), // 修改回单附件
  153 + modifyDepartureWeightAttachment: params => vm.$u.http.post( freightAPI + '/freightOrder/modifyReceiptAttachment', params), // 修改装车磅单
  154 + modifyArrivalWeightAttachment: params => vm.$u.http.post( freightAPI + '/freightOrder/modifyReceiptAttachment', params), // 修改卸车磅单
153 155 count: params => vm.$u.http.post( freightAPI + '/freightOrder/count', params), // 状态数量
154 156 getDetail: params => vm.$u.http.get( freightAPI + '/freightOrder/getDetail', {params}), // 订单详情
155 157 checkDepartureTime: params => vm.$u.http.get( freightAPI + '/freightOrder/checkDepartureTime', params), // 校验选择的运单发车时间是否一致
... ... @@ -175,6 +177,7 @@ module.exports = (vm) => {
175 177 count: params => vm.$u.http.get( freightAPI + '/freightGoodsSourceV2/count', {params}),
176 178 getDetail: params => vm.$u.http.get( freightAPI + '/freightGoodsSourceV2/getDetail', {params}),
177 179 add: data => vm.$u.http.post( freightAPI + '/freightGoodsSourceV2/add', data,{custom: {toast:true}}),
  180 + addOrder: data => vm.$u.http.post( freightAPI + '/freightGoodsSourceV2/addOrder', data,{custom: {toast:true}}),
178 181 modify: data => vm.$u.http.post( freightAPI + '/freightGoodsSourceV2/modify', data),
179 182 complete: data => vm.$u.http.post( freightAPI + '/freightGoodsSourceV2/complete', data),
180 183 cancel: data => vm.$u.http.post( freightAPI + '/freightGoodsSourceV2/cancel', data),
... ...
iconfont/iconfont.css
... ... @@ -370,9 +370,58 @@
370 370 content: "\e722";
371 371 }
372 372  
373   -.icon-radio-no:before {
  373 +.icon-secure:before {
374 374 content: "\e723";
375 375 }
376   -.icon-radio-chose:before {
  376 +
  377 +.icon-kanban1:before {
377 378 content: "\e724";
378 379 }
  380 +
  381 +.icon-kanban2:before {
  382 + content: "\e725";
  383 +}
  384 +
  385 +.icon-kanban3:before {
  386 + content: "\e726";
  387 +}
  388 +
  389 +.icon-sign:before {
  390 + content: "\e727";
  391 +}
  392 +.icon-bulk-order:before {
  393 + content: "\e728";
  394 +}
  395 +.icon-customer:before {
  396 + content: "\e731";
  397 +}
  398 +.icon-loadtime:before {
  399 + content: "\e733";
  400 +}
  401 +.icon-quotation:before {
  402 + content: "\e735";
  403 +}
  404 +.icon-cartype:before {
  405 + content: "\e730";
  406 +}
  407 +.icon-car-inviter:before {
  408 + content: "\e734";
  409 +}
  410 +.icon-location:before {
  411 + content: "\e732";
  412 +}
  413 +.icon-star-fill:before {
  414 + content: "\e736";
  415 +}
  416 +.icon-radio-chose:before {
  417 + content: "\e739";
  418 +}
  419 +.icon-radio-no:before {
  420 + content: "\e740";
  421 +}
  422 +.icon-switch-vertical:before {
  423 + content: "\e741";
  424 +}
  425 +.icon-pay-rmb:before {
  426 + content: "\e741";
  427 +}
... ...
iconfont/iconfont.ttf
No preview for this file type
pages/goodSource/card.vue
1 1 <template>
2   - <view class="card" @click="toDetail">
  2 + <view class="card">
3 3 <view class="card-header">
4 4 <view class="title">
5 5 <view class="order-no">
... ... @@ -21,7 +21,7 @@
21 21 <view class="v-t-img">
22 22 <image src="@/static/svgs/user.svg" />
23 23 </view>
24   - <text>{{ item.customerName }}</text>
  24 + <text>{{ item.projectName }}</text>
25 25 </view>
26 26 <view class="v-t">
27 27 <text style="white-space: nowrap; overflow: hidden; color: #999; max-width: 50vw; text-overflow: ellipsis"> {{ formatSpecification }}/{{ formatVanType }} </text>
... ... @@ -57,8 +57,8 @@
57 57 }}</text>
58 58 </text>
59 59 </view>
60   - <view v-if="item.priceType === 'TON'" class="task-2"> 剩余{{ item.remainGoodsWeight || item.goodsWeight }}吨 </view>
61   - <view v-if="item.priceType === 'VEHICLE'" class="task-2"> 还需要{{ item.remainVehicleNumber || item.vehicleNumber }}车 </view>
  60 + <view v-if="item.priceType === 'TON'" class="task-2"> 剩余{{ item.remainGoodsWeight }}吨 </view>
  61 + <view v-if="item.priceType === 'VEHICLE'" class="task-2"> 还需要{{ item.remainVehicleNumber }}车 </view>
62 62 </view>
63 63 </view>
64 64 <view v-if="!onlyShow" class="cc-operate">
... ... @@ -76,10 +76,10 @@
76 76 <zb-tooltip placement="bottom" :visible="visible" @update:visible="e => (visible = e)">
77 77 <template #content>
78 78 <view class="more-action">
79   - <view v-if="['MATCHING'].includes(item.status)" @click="modifyGoodSource"> 修改货源 </view>
80   - <view v-if="['MATCHING', 'COMPLETED'].includes(item.status)" @click="cancelGoodSource"> 取消货源 </view>
81   - <view v-if="['MATCHING'].includes(item.status)" @click="endGoodSource"> 结束找车 </view>
82   - <view v-if="['CANCELLED'].includes(item.status)" @click="deleteGoodSource"> 删除货源 </view>
  79 + <view v-if="$permission('/freightGoodsSource/modify') && ['MATCHING'].includes(item.status)" @click="modifyGoodSource"> 修改货源 </view>
  80 + <view v-if="$permission('/freightGoodsSource/cancel') && ['MATCHING', 'COMPLETED'].includes(item.status)" @click="cancelGoodSource"> 取消货源 </view>
  81 + <view v-if="$permission('/freightGoodsSource/complete') && ['MATCHING'].includes(item.status)" @click="endGoodSource"> 结束找车 </view>
  82 + <view v-if="$permission('/freightGoodsSource/delete') && ['CANCELLED'].includes(item.status)" @click="deleteGoodSource"> 删除货源 </view>
83 83 </view>
84 84 </template>
85 85 <view class="button">
... ... @@ -152,11 +152,6 @@ export default {
152 152 qrShow() {
153 153 this.$emit('qrShow', this.item.code, this.item);
154 154 },
155   - // 详情
156   - toDetail() {
157   - if (this.onlyShow) return;
158   - uni.navigateTo({ url: `/pages/bulkOrder/bulk-order-detail?code=${this.item.code}` });
159   - },
160 155 // 抢单记录
161 156 toGrabPage() {
162 157 uni.navigateTo({ url: `/pages/goodSource/grab-record?goodsSourceCode=${this.item.code}` });
... ...
pages/goodSource/grab-record.vue
... ... @@ -5,31 +5,34 @@
5 5 <view class="line"></view>
6 6 <view class="quick-tag">
7 7 <view class="quick-tag-group">
8   - <view class="quick-tag-item" :class="searchForm.projectCode ? 'active' : ''" @click="selectQuickTag({ key: 'projectCode', value: searchForm.projectCode })">
9   - <text>{{ searchForm.projectName || '车牌号' }}</text>
10   - <view class="sx-img">
11   - <image v-if="searchForm.projectCode" class="sx-image" :src="formatImagePath('active-down')"></image>
12   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  8 + <view class="quick-tag-item" :class="searchForm.vehicleLicenseNum ? 'active' : ''" @click="onSelectPlate">
  9 + <text>{{ searchForm.vehicleLicenseNum || '车牌号' }}</text>
  10 + <view @click.stop="clearSearchForm('vehicleLicenseNum')" v-if="searchForm.vehicleLicenseNum" style="position: absolute; right: 0">
  11 + <u-icon name="close-circle"></u-icon>
13 12 </view>
14   - <view style="position: absolute; top: 0; right: 0">
15   - <u-icon name="close"></u-icon>
  13 + <view v-else class="sx-img">
  14 + <image class="sx-image" :src="formatImagePath('down')"></image>
16 15 </view>
17 16 </view>
18   - <view class="quick-tag-item" :class="searchForm.startCityCode ? 'active' : ''" @click="selectQuickTag({ key: 'startCityCode', value: searchForm.startCityCode })">
19   - <text>{{ searchForm.startCityName || '司机姓名' }}</text>
20   - <view class="sx-img">
21   - <image v-if="searchForm.startCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>
22   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  17 + <view class="quick-tag-item" :class="searchForm.driverName ? 'active' : ''" @click="selectQuickTag({ key: 'driverName', value: searchForm.driverName })">
  18 + <text>{{ searchForm.driverName || '司机姓名' }}</text>
  19 + <view @click.stop="clearSearchForm('driverName')" v-if="searchForm.driverName" style="position: absolute; right: 0">
  20 + <u-icon name="close-circle"></u-icon>
  21 + </view>
  22 + <view v-else class="sx-img">
  23 + <image class="sx-image" :src="formatImagePath('down')"></image>
23 24 </view>
24 25 </view>
25   - <view class="quick-tag-item" :class="searchForm.endCityCode ? 'active' : ''" @click="selectQuickTag({ key: 'endCityCode', value: searchForm.endCityCode })">
26   - <text>{{ searchForm.endCityName || '司机手机' }}</text>
27   - <view class="sx-img">
28   - <image v-if="searchForm.endCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>
29   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  26 + <view class="quick-tag-item" :class="searchForm.driverMobile ? 'active' : ''" @click="selectQuickTag({ key: 'driverMobile', value: searchForm.driverMobile })">
  27 + <text>{{ searchForm.driverMobile || '司机手机' }}</text>
  28 + <view @click.stop="clearSearchForm('driverMobile')" v-if="searchForm.driverMobile" style="position: absolute; right: 0">
  29 + <u-icon name="close-circle"></u-icon>
  30 + </view>
  31 + <view v-else class="sx-img">
  32 + <image class="sx-image" :src="formatImagePath('down')"></image>
30 33 </view>
31 34 </view>
32   - <view>抢单时间<zui-icon name="enter"></zui-icon></view>
  35 + <view @click="sortChange"><text style="color: #999; margin-right: 6rpx">抢单时间</text><zui-icon name="switch-vertical"></zui-icon></view>
33 36 </view>
34 37 </view>
35 38 </template>
... ... @@ -37,13 +40,11 @@
37 40 <List ref="list" v-model="list" :loading.sync="loading" :api="searchAPI">
38 41 <view v-for="(form, index) in list" :key="index">
39 42 <view class="card">
40   - <view-item title="订单号" :value="form.code">
41   - <view style="flex: 1; display: flex; justify-content: space-between">
42   - <view>{{ form.code }}</view>
43   - <view :style="{ color: statusMap[form.status], display: 'flex' }">
44   - <render-dict :value="form.status" dict="FREIGHT_GOODS_SOURCE_BIDDING_STATUS"></render-dict>
45   - </view>
46   - </view>
  43 + <view style="position: absolute; top: 24rpx; right: 24rpx" :style="{ color: statusMap[form.status] }">
  44 + <render-dict :value="form.status" dict="FREIGHT_GOODS_SOURCE_BIDDING_STATUS"></render-dict>
  45 + </view>
  46 + <view-item title="订单号" v-if="form.code">
  47 + <field-copy class="color-blue" :value="form.code" v-if="form.code">{{ form.code }} </field-copy>
47 48 </view-item>
48 49 <view-item title="抢单司机">
49 50 <field-call :value="form.driverMobile">
... ... @@ -57,7 +58,7 @@
57 58 <text>
58 59 <render-dict :value="form.vanType" dict="VEHICLE_COMPARTMENT_TYPE"></render-dict>
59 60 </text>
60   - <text>/{{ form.vehicleLicenseNum }}</text>
  61 + <text>{{ form.vehicleLicenseNum }}</text>
61 62 <text v-if="form.trailerLicenseNum">/{{ form.trailerLicenseNum }}</text>
62 63 </view-item>
63 64 <view-item title="抢单时间" :value="form.biddingTime"></view-item>
... ... @@ -65,16 +66,31 @@
65 66 <text>{{ form.biddingWeight || '--' }}吨</text>
66 67 </view-item>
67 68 <view class="buts">
68   - <view>总运费:{{ form.paidAmount }}</view>
69   - <template v-if="form.status === 'WAIT_ASSIGN'">
70   - <zui-button class="zui-button" @click="(cancelCode = form.code), (cancelRemark = ''), (cancelShow = true)">取消</zui-button>
71   - <zui-button class="zui-button" type="ghost" theme="primary" @click="() => toSubmit(form)">确认</zui-button>
72   - </template>
  69 + <view
  70 + >总运费:<text class="color-red">{{ form.paidAmount }}</text
  71 + >元</view
  72 + >
  73 + <view style="display: flex; gap: 24rpx; justify-content: space-between" v-if="form.status === 'WAIT_ASSIGN'">
  74 + <zui-button v-if="$permission('/freightGoodsSource/cancelBidding')" class="zui-button" @click="(cancelCode = form.code), (cancelRemark = ''), (cancelShow = true)"
  75 + >取消</zui-button
  76 + >
  77 + <zui-button v-if="$permission('/freightGoodsSource/addOrder')" theme="primary" @click="() => toSubmit(form)">成交指派</zui-button>
  78 + </view>
73 79 </view>
74 80 </view>
75 81 </view>
76 82 </List>
77   - <u-modal :show="cancelShow" title="取消原因" @cancel="cancelShow = false" @confirm="confirmCancel" showConfirmButton>
  83 + <u-modal
  84 + :show="driverSearchShow"
  85 + :title="driverSearchKey === 'driverName' ? '司机姓名' : '司机手机'"
  86 + @cancel="driverSearchShow = false"
  87 + show-cancel-button
  88 + @confirm="driverConfirm"
  89 + @close="driverSearchShow = false"
  90 + >
  91 + <u-input v-model="driverStr"> </u-input>
  92 + </u-modal>
  93 + <u-modal :show="cancelShow" title="取消原因" @cancel="cancelShow = false" @confirm="confirmCancel" show-cancel-button>
78 94 <u-input v-model="cancelRemark" placeholder="取消原因"></u-input>
79 95 </u-modal>
80 96 <popup-platenumber v-model="platenumberVisible" :plate="searchForm.vehicleCode" @cancel="platenumberVisible = false" @confirm="onPlatenumberSelect" />
... ... @@ -83,13 +99,18 @@
83 99 </template>
84 100  
85 101 <script>
86   -import MIX_ORIGIN from '@/mixins/origin';
  102 +import page from '@/mixins/page';
87 103 import { mapGetters } from 'vuex';
88   -
  104 +import FieldCopy from '@/components/field/field-copy.vue';
  105 +import dayjs from 'dayjs';
89 106 export default {
90   - mixins: [MIX_ORIGIN],
  107 + components: { FieldCopy },
  108 + mixins: [page],
91 109 data() {
92 110 return {
  111 + driverSearchShow: false,
  112 + driverSearchKey: '',
  113 + driverStr: '',
93 114 cancelShow: false,
94 115 cancelCode: '',
95 116 cancelRemark: '',
... ... @@ -110,11 +131,10 @@ export default {
110 131 },
111 132 platenumberVisible: false,
112 133 searchForm: {
113   - vehicleCode: '',
114   - loadFlag: '',
115   - unloadFlag: '',
116   - waybillCode: '',
117   - waybillStatus: '',
  134 + vehicleLicenseNum: '',
  135 + driverName: '',
  136 + driverMobile: '',
  137 + sortFlag: false,
118 138 },
119 139 };
120 140 },
... ... @@ -135,6 +155,10 @@ export default {
135 155 },
136 156 },
137 157 methods: {
  158 + clearSearchForm(label) {
  159 + this.searchForm = Object.assign(this.searchForm, { [label]: '' });
  160 + this.onSearch();
  161 + },
138 162 // 打开车牌选择
139 163 onSelectPlate() {
140 164 this.platenumberVisible = true;
... ... @@ -142,14 +166,29 @@ export default {
142 166 // 选中车牌
143 167 onPlatenumberSelect(value) {
144 168 this.platenumberVisible = false;
145   - this.searchForm.vehicleCode = value;
  169 + this.searchForm.vehicleLicenseNum = value;
146 170 this.onSearch({ showLoading: true });
147 171 },
  172 + selectQuickTag({ key, value }) {
  173 + this.driverStr = value;
  174 + this.driverSearchKey = key;
  175 + this.driverSearchShow = true;
  176 + },
  177 + driverConfirm() {
  178 + this.driverSearchShow = false;
  179 + this.searchForm = Object.assign(this.searchForm, { [this.driverSearchKey]: this.driverStr });
  180 + this.onSearch();
  181 + },
  182 + sortChange() {
  183 + this.searchForm = Object.assign(this.searchForm, { sortFlag: !this.searchForm.sortFlag });
  184 + this.onSearch();
  185 + },
148 186 // 查询数据
149 187 searchAPI(params) {
150 188 this.getCount();
151 189 return uni.$u.api.freightGoodsSourceV2.biddingPage({
152 190 ...params,
  191 + ...this.searchForm,
153 192 status: this.orderStatus,
154 193 goodsSourceCode: this.goodsSourceCode,
155 194 });
... ... @@ -170,20 +209,51 @@ export default {
170 209 },
171 210 // 确认-发布需求
172 211 toSubmit(item) {
  212 + let form = {
  213 + ...item,
  214 + goodsWeight: item.biddingWeight,
  215 + goodsSourceCode: item.goodsSourceCode,
  216 + goodsSourceBiddingCode: item.code,
  217 + loadTime: dayjs(item.biddingTime).add(3, 'hour').format('YYYY-MM-DD HH:mm:ss'),
  218 + waypoints: [
  219 + {
  220 + cityCode: item.startCityCode,
  221 + areaCode: item.startAreaCode,
  222 + address: item.startAddress,
  223 + lng: item.startLng,
  224 + lat: item.startLat,
  225 + },
  226 + {
  227 + cityCode: item.endCityCode,
  228 + areaCode: item.endAreaCode,
  229 + address: item.endAddress,
  230 + lng: item.endLng,
  231 + lat: item.endLat,
  232 + },
  233 + ],
  234 + };
173 235 uni.navigateTo({
174 236 url: `/pages/order/add?eventCode=${item.code}`,
175 237 success(res) {
176   - res.eventChannel.emit('get-item', item);
  238 + res.eventChannel.emit('get-item', form);
177 239 },
178 240 });
179 241 },
180 242 // 取消
181 243 confirmCancel() {
182 244 if (this.loading) return;
183   - uni.$u.api.freightGoodsSourceV2.cancelBidding({ cancelReason: this.cancelRemark, code: this.cancelCode }).then(res => {
184   - uni.showToast({ title: '取消成功', icon: 'none' });
185   - this.onSearch({ showLoading: true });
186   - });
  245 + this.loading = true;
  246 + uni.$u.api.freightGoodsSourceV2
  247 + .cancelBidding({ cancelReason: this.cancelRemark, code: this.cancelCode })
  248 + .then(res => {
  249 + this.cancelShow = false;
  250 + this.loading = false;
  251 + uni.showToast({ title: '取消成功', icon: 'none' });
  252 + this.onSearch({ showLoading: true });
  253 + })
  254 + .catch(() => {
  255 + this.loading = false;
  256 + });
187 257 },
188 258 },
189 259 };
... ... @@ -212,8 +282,11 @@ export default {
212 282 padding-left: $padding-xs !important;
213 283 padding-right: $padding-xs !important;
214 284 overflow-y: auto;
  285 + justify-content: space-between;
  286 + gap: 15rpx;
215 287  
216 288 .quick-tag-item {
  289 + flex: 1;
217 290 flex-shrink: 0;
218 291 min-width: 158upx;
219 292 height: 58upx;
... ... @@ -229,7 +302,7 @@ export default {
229 302 box-sizing: border-box;
230 303 position: relative;
231 304 &:not(:last-child) {
232   - margin-right: 18upx;
  305 + //margin-right: 18upx;
233 306 }
234 307  
235 308 &.active {
... ... @@ -267,21 +340,23 @@ export default {
267 340 padding: 22rpx !important;
268 341  
269 342 .card {
270   - padding: 24rpx 12rpx 24rpx 0;
  343 + padding: 24rpx 0 24rpx 0;
271 344 margin-bottom: 20rpx;
272 345 background: white;
273 346 border-radius: 20rpx;
  347 + position: relative;
274 348 .view-item {
275 349 display: flex;
  350 + margin-bottom: 20rpx;
  351 + font-size: 26rpx;
276 352 .view-item__label {
277 353 padding-left: 26rpx;
278 354 color: #999999;
279   - width: 185rpx;
  355 + width: 170rpx;
280 356 }
281 357 .view-item__value {
282 358 flex: 1;
283 359 color: #2b2a27;
284   - padding-left: 32rpx;
285 360 padding-right: 5rpx;
286 361 display: flex;
287 362 flex-wrap: wrap;
... ... @@ -291,12 +366,12 @@ export default {
291 366 margin-bottom: 30rpx;
292 367 }
293 368 .buts {
  369 + font-size: 30rpx;
  370 + padding-left: 30rpx;
  371 + padding-right: 24rpx;
294 372 display: flex;
295   - justify-content: flex-end;
296   -
297   - .zui-button + .zui-button {
298   - margin-left: 20rpx;
299   - }
  373 + justify-content: space-between;
  374 + align-items: center;
300 375 }
301 376 }
302 377 }
... ...
pages/goodSource/index.vue
... ... @@ -7,29 +7,35 @@
7 7 <view class="quick-tag-group">
8 8 <view class="quick-tag-item" :class="searchForm.projectCode ? 'active' : ''" @click="selectQuickTag({ key: 'projectCode', value: searchForm.projectCode })">
9 9 <text>{{ searchForm.projectName || '所属项目' }}</text>
10   - <view class="sx-img">
11   - <image v-if="searchForm.projectCode" class="sx-image" :src="formatImagePath('active-down')"></image>
12   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  10 + <view @click.stop="clearProject" v-if="searchForm.projectCode" style="position: absolute; right: 0">
  11 + <u-icon name="close-circle"></u-icon>
13 12 </view>
14   - <view style="position: absolute; top: 0; right: 0">
15   - <u-icon name="close"></u-icon>
  13 + <view v-else class="sx-img">
  14 + <!-- <image class="sx-image" :src="formatImagePath('active-down')"></image>-->
  15 + <image class="sx-image" :src="formatImagePath('down')"></image>
16 16 </view>
17 17 </view>
18 18 <view class="quick-tag-item" :class="searchForm.startCityCode ? 'active' : ''" @click="selectQuickTag({ key: 'startCityCode', value: searchForm.startCityCode })">
19 19 <text>{{ searchForm.startCityName || '始发地' }}</text>
20   - <view class="sx-img">
21   - <image v-if="searchForm.startCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>
22   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  20 + <view @click.stop="clearStartCity" v-if="searchForm.startCityCode" style="position: absolute; right: 0">
  21 + <u-icon name="close-circle"></u-icon>
  22 + </view>
  23 + <view v-else class="sx-img">
  24 + <!-- <image v-if="searchForm.startCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>-->
  25 + <image class="sx-image" :src="formatImagePath('down')"></image>
23 26 </view>
24 27 </view>
25 28 <view class="quick-tag-item" :class="searchForm.endCityCode ? 'active' : ''" @click="selectQuickTag({ key: 'endCityCode', value: searchForm.endCityCode })">
26 29 <text>{{ searchForm.endCityName || '目的地' }}</text>
27   - <view class="sx-img">
28   - <image v-if="searchForm.endCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>
29   - <image v-else class="sx-image" :src="formatImagePath('down')"></image>
  30 + <view @click.stop="clearEndCity" v-if="searchForm.endCityCode" style="position: absolute; right: 0">
  31 + <u-icon name="close-circle"></u-icon>
  32 + </view>
  33 + <view v-else class="sx-img">
  34 + <!-- <image v-if="searchForm.endCityCode" class="sx-image" :src="formatImagePath('active-down')"></image>-->
  35 + <image class="sx-image" :src="formatImagePath('down')"></image>
30 36 </view>
31 37 </view>
32   - <view>发布时间<zui-icon name="enter"></zui-icon></view>
  38 + <view @click="sortChange"><text style="color: #999; margin-right: 6rpx">发布时间</text><zui-icon name="switch-vertical"></zui-icon></view>
33 39 </view>
34 40 <!-- <view class="quick-screen" @click="openFilter">-->
35 41 <!-- <image class="search-image" :src="formatImagePath('search')"></image>-->
... ... @@ -45,9 +51,8 @@
45 51 <Empty tips="暂无数据" />
46 52 </template>
47 53 </List>
48   - <view class="add-order" @tap="toAddPage('')">
  54 + <view v-if="$permission('/freightGoodsSource/add')" class="add-order" @tap="toAddPage('')">
49 55 <zui-icon name="add" color="#fff" size="30px"></zui-icon>
50   - <!-- <image class="sx-image" src="/static/addOrder.png"></image>-->
51 56 </view>
52 57 </template>
53 58 <u-popup :show="popShow" @close="closePop" closeable>
... ... @@ -59,9 +64,9 @@
59 64 </view>
60 65 </view>
61 66 </u-popup>
62   - <u-popup :show="qrShow" @close="qrShow = false" mode="center" closeable>
  67 + <u-popup :show="qrShow" @close="qrShow = false" mode="center" :closeable="false" :safe-area-inset-bottom="false">
63 68 <l-painter ref="painter" :board="poster"></l-painter>
64   - <view style="margin-top: 30upx">
  69 + <view style="margin: 30upx">
65 70 <u-button type="primary" @click="saveQrImage">保存</u-button>
66 71 </view>
67 72 </u-popup>
... ... @@ -96,6 +101,7 @@ export default {
96 101 endCityCode: '',
97 102 endCityName: '',
98 103 status: '',
  104 + sortFlag: false,
99 105 },
100 106 activeTab: 0,
101 107 count: {},
... ... @@ -128,6 +134,22 @@ export default {
128 134 this.list = [];
129 135 this.onSearch();
130 136 },
  137 + clearProject() {
  138 + this.searchForm = Object.assign(this.searchForm, { projectCode: '', projectName: '' });
  139 + this.onSearch();
  140 + },
  141 + clearStartCity() {
  142 + this.searchForm = Object.assign(this.searchForm, { startCityCode: '', startCityName: '' });
  143 + this.onSearch();
  144 + },
  145 + clearEndCity() {
  146 + this.searchForm = Object.assign(this.searchForm, { endCityCode: '', endCityName: '' });
  147 + this.onSearch();
  148 + },
  149 + sortChange() {
  150 + this.searchForm = Object.assign(this.searchForm, { sortFlag: !this.searchForm.sortFlag });
  151 + this.onSearch();
  152 + },
131 153 selectQuickTag({ key, value }) {
132 154 this.searchForm = Object.assign(this.searchForm, { [key]: value });
133 155 if (key == 'startCityCode') {
... ... @@ -267,29 +289,25 @@ export default {
267 289 toDetail(code) {
268 290 uni.navigateTo({ url: '/pages/goodSource/detail?code=' + code });
269 291 },
270   - qrCodeShow(code, data) {
  292 + qrCodeShow(code) {
271 293 if (this.loading) return;
272 294 this.loading = true;
273   - this.qrShow = true;
274   - uni.$u.api.freightOrder
275   - .getSensitiveByOrderCode({ orderCode: code })
276   - .then(res => {
277   - if (res.success) {
278   - uni.$u.api.freightOrder
279   - .buildMaQrcode({ orderCode: code })
280   - .then(res2 => {
281   - this.loading = false;
282   - if (res2.success) {
283   - this.poster = this.getPoster(res.result, data, res2.result);
284   - console.info(this.poster);
285   - }
286   - })
287   - .catch(e => {
288   - this.loading = false;
289   - });
290   - }
  295 + uni.$u.api.freightGoodsSourceV2
  296 + .getDetail({ code })
  297 + .then(detail => {
  298 + uni.$u.api.freightGoodsSourceV2
  299 + .buildMaQrcode({ code })
  300 + .then(qrcode => {
  301 + if (qrcode.success && detail.success) {
  302 + this.qrShow = true;
  303 + this.poster = this.getPoster(detail.result, qrcode.result);
  304 + }
  305 + })
  306 + .finally(() => {
  307 + this.loading = false;
  308 + });
291 309 })
292   - .catch(e => {
  310 + .catch(() => {
293 311 this.loading = false;
294 312 });
295 313 },
... ... @@ -324,8 +342,11 @@ export default {
324 342 padding-left: $padding-xs !important;
325 343 padding-right: $padding-xs !important;
326 344 overflow-y: auto;
  345 + justify-content: space-between;
  346 + gap: 15rpx;
327 347  
328 348 .quick-tag-item {
  349 + flex: 1;
329 350 flex-shrink: 0;
330 351 min-width: 158upx;
331 352 height: 58upx;
... ... @@ -341,7 +362,7 @@ export default {
341 362 box-sizing: border-box;
342 363 position: relative;
343 364 &:not(:last-child) {
344   - margin-right: 18upx;
  365 + //margin-right: 18upx;
345 366 }
346 367  
347 368 &.active {
... ...
pages/goodSource/qr-painter.js
1 1 import dayjs from 'dayjs';
  2 +import { mapGetters } from 'vuex';
2 3 export default {
3 4 data() {
4 5 return {
5 6 posterCss: { width: '150rpx', height: '150rpx', padding: '11rpx', backgroundColor: '#FFFFFF', borderRadius: '50%', objectFit: 'cover' }, // 二维码大小样式
6   - QRcss: { position: 'fixed', left: '52rpx', bottom: '24rpx', display: 'flex' }, // 二维码定位样式
  7 + QRcss: { position: 'fixed', left: '32rpx', bottom: '24rpx', display: 'flex' }, // 二维码定位样式
7 8 };
8 9 },
  10 + computed: {
  11 + ...mapGetters(['dictValue']),
  12 + },
9 13 methods: {
10 14 saveQrImage() {
11 15 this.$refs.painter.canvasToTempFilePathSync({
... ... @@ -24,249 +28,331 @@ export default {
24 28 },
25 29 });
26 30 },
27   - getPoster(item, params, wxcode) {
28   - let driverInfo = item.driverName ? item.driverName : '';
29   - driverInfo += item.driverMobile ? item.driverMobile : '';
30   - let vehicle = item.vehicleLicenseNum;
31   - if (item.trailerLicenseNum) {
32   - vehicle += '·' + item.trailerLicenseNum;
  31 + formatVanType(vanType) {
  32 + let res = [];
  33 + for (let v of vanType.split(',')) {
  34 + if (v === 'ALL') {
  35 + res.push('不限');
  36 + } else {
  37 + res.push(this.dictValue('VEHICLE_COMPARTMENT_TYPE', v));
  38 + }
  39 + }
  40 + return res.join(',');
  41 + },
  42 + formatSpecification(specification) {
  43 + let res = [];
  44 + for (let v of specification.split(',')) {
  45 + if (v === 'ALL') {
  46 + res.push('不限');
  47 + } else {
  48 + res.push(this.dictValue('VEHICLE_SPECIFICATION', v));
  49 + }
33 50 }
  51 + return res.join(',');
  52 + },
  53 + getPoster(detail, wxcode) {
  54 + let formatVanType = this.formatVanType(detail.vanType);
  55 + let formatSpecification = this.formatSpecification(detail.specification);
34 56 return {
35 57 css: {
36   - width: '640rpx',
37   - height: '880rpx',
38   - backgroundImage: 'url(https://zeyi-tms-product.oss-cn-hangzhou.aliyuncs.com/image/freight/b6988d70-26db-490c-9ddf-e59c554fa2ff.png)',
  58 + width: '660rpx',
  59 + height: '919rpx',
  60 + backgroundImage: 'url(https://zeyi-tms-product.oss-cn-hangzhou.aliyuncs.com/image/tms/f8cefac5-86cd-4f13-89f3-66fe2c6a0ea5.png)',
39 61 objectFit: 'cover',
40 62 },
41 63 views: [
42 64 {
43 65 type: 'view',
  66 + css: {
  67 + width: '660rpx',
  68 + height: '919rpx',
  69 + padding: '10rpx',
  70 + },
44 71 views: [
45 72 {
46 73 type: 'text',
47   - text: '订 单 号:',
  74 + text: '则一飞牛货源码',
48 75 css: {
49   - width: '300rpx',
50   - height: '33rpx',
51   - fontSize: '24rpx',
52   - fontSamily: 'PingFangSC-Regular',
53   - color: '#999999',
54   - lineHeight: '33rpx',
55   - display: 'block',
56   - boxOrient: 'vertical',
57   - lineClamp: 1 /* 这里是超出几行省略 */,
58   - position: 'fixed',
59   - top: '169rpx',
60   - left: '75rpx',
  76 + width: '550rpx',
  77 + height: '70rpx',
  78 + padding: '15rpx 30rpx',
  79 + fontSize: '30rpx',
  80 + color: '#000000',
61 81 },
62 82 },
63 83 {
64   - type: 'text',
65   - text: params.code,
  84 + type: 'view',
66 85 css: {
67   - width: '400rpx',
68   - height: '33rpx',
69   - fontSize: '24rpx',
70   - fontSamily: 'PingFangSC-Regular',
71   - color: '#121212',
72   - lineHeight: '33rpx',
73   - overflow: 'hidden',
74   - textOverflow: 'ellipsis',
75   - display: 'block',
76   - boxOrient: 'vertical',
77   - lineClamp: 1 /* 这里是超出几行省略 */,
78   - position: 'fixed',
79   - top: '169rpx',
80   - left: '195rpx',
  86 + width: '580rpx',
  87 + height: '40rpx',
  88 + padding: '20rpx 30rpx 15rpx 30rpx',
81 89 },
  90 + views: [
  91 + {
  92 + type: 'view',
  93 + css: {
  94 + display: 'inline-block',
  95 + width: '410rpx',
  96 + fontSize: '22rpx',
  97 + lineHeight: '1em',
  98 + verticalAlign: 'bottom',
  99 + },
  100 + views: [
  101 + {
  102 + type: 'text',
  103 + text: '货源单号:',
  104 + css: {
  105 + color: '#999999',
  106 + verticalAlign: 'bottom',
  107 + },
  108 + },
  109 + {
  110 + type: 'text',
  111 + text: detail.code,
  112 + css: {
  113 + color: '#000000',
  114 + verticalAlign: 'bottom',
  115 + },
  116 + },
  117 + ],
  118 + },
  119 + {
  120 + type: 'view',
  121 + css: {
  122 + display: 'inline-block',
  123 + width: '170rpx',
  124 + lineHeight: '1em',
  125 + textAlign: 'right',
  126 + verticalAlign: 'bottom',
  127 + },
  128 + views: [
  129 + {
  130 + type: 'text',
  131 + text: detail.priceType === 'TON' ? detail.weightUnitPrice : detail.vehicleUnitPrice,
  132 + css: {
  133 + color: '#ed3f3f',
  134 + fontSize: '28rpx',
  135 + verticalAlign: 'bottom',
  136 + },
  137 + },
  138 + {
  139 + type: 'text',
  140 + text: detail.priceType === 'TON' ? '元/吨' : '元/车',
  141 + css: {
  142 + color: '#2b2b2b',
  143 + fontSize: '20rpx',
  144 + verticalAlign: 'bottom',
  145 + },
  146 + },
  147 + ],
  148 + },
  149 + ],
82 150 },
83 151 {
84 152 type: 'text',
85   - text: '任务日期:',
  153 + text: detail.startProvinceName + '-' + detail.startCityName,
86 154 css: {
87   - width: '400rpx',
88   - height: '33rpx',
89   - fontSize: '24rpx',
90   - fontSamily: 'PingFangSC-Regular',
91   - color: '#999999',
92   - lineHeight: '33rpx',
93   - display: 'block',
94   - boxOrient: 'vertical',
95   - lineClamp: 1 /* 这里是超出几行省略 */,
96   - position: 'fixed',
97   - top: '204rpx',
98   - left: '75rpx',
  155 + width: '440rpx',
  156 + height: '40rpx',
  157 + fontSize: '28rpx',
  158 + paddingLeft: '80rpx',
  159 + color: '#000000',
99 160 },
100 161 },
101 162 {
102 163 type: 'text',
103   - text: dayjs(params.loadTime).format('YYYY-MM-DD'),
  164 + text: '总里程:' + detail.distance + 'km',
104 165 css: {
105   - width: '400rpx',
106   - height: '33rpx',
107   - fontSize: '24rpx',
108   - fontSamily: 'PingFangSC-Regular',
109   - color: '#121212',
110   - lineHeight: '33rpx',
111   - overflow: 'hidden',
112   - textOverflow: 'ellipsis',
113   - display: 'block',
114   - boxOrient: 'vertical',
115   - lineClamp: 1 /* 这里是超出几行省略 */,
116   - position: 'fixed',
117   - top: '204rpx',
118   - left: '195rpx',
  166 + width: '440rpx',
  167 + height: '20rpx',
  168 + fontSize: '20rpx',
  169 + padding: '20rpx 80rpx',
  170 + color: '#999999',
119 171 },
120 172 },
121 173 {
122 174 type: 'text',
123   - text: params.startCityName + '-' + params.startAreaName,
  175 + text: detail.endProvinceName + '-' + detail.endCityName,
124 176 css: {
125   - width: '400rpx',
126   - height: '40rpx',
127   - fontSize: '36rpx',
128   - fontSamily: 'PingFangSC-Semibold, PingFang SC',
129   - fontWeight: '600',
130   - color: '#051B33',
131   - lineHeight: '40rpx',
132   - overflow: 'hidden',
133   - textOverflow: 'ellipsis',
134   - display: 'block',
135   - boxOrient: 'vertical',
136   - lineClamp: 1 /* 这里是超出几行省略 */,
137   - position: 'fixed',
138   - top: '270rpx',
139   - left: '129rpx',
  177 + width: '440rpx',
  178 + height: '50rpx',
  179 + fontSize: '28rpx',
  180 + paddingLeft: '80rpx',
  181 + color: '#000000',
140 182 },
141 183 },
142 184 {
143 185 type: 'text',
144   - text: params.endCityName + '-' + params.endAreaName,
  186 + text: dayjs(detail.startTime).format('YYYY-MM-DD HH:mm') + ' 到 ' + dayjs(detail.endTime).format('YYYY-MM-DD HH:mm') + ' 期间装货',
145 187 css: {
146   - width: '400rpx',
  188 + width: '540rpx',
147 189 height: '40rpx',
148   - fontSize: '36rpx',
149   - fontSamily: 'PingFangSC-Semibold, PingFang SC',
150   - fontWeight: '600',
151   - color: '#051B33',
152   - lineHeight: '40rpx',
153   - overflow: 'hidden',
154   - textOverflow: 'ellipsis',
155   - display: 'block',
156   - boxOrient: 'vertical',
157   - lineClamp: 1 /* 这里是超出几行省略 */,
158   - position: 'fixed',
159   - top: '405rpx',
160   - left: '129rpx',
161   - },
162   - },
163   - {
164   - type: 'text',
165   - text: '总里程:' + item.distance + 'KM',
166   - css: {
167   - width: '400rpx',
168   - height: '33rpx',
169 190 fontSize: '24rpx',
170   - fontWeight: '400',
171   - fontSamily: 'PingFangSC-Medium, PingFang SC',
  191 + padding: '15rpx 40rpx',
172 192 color: '#999999',
173   - lineHeight: '33rpx',
174   - position: 'fixed',
175   - top: '345rpx',
176   - left: '129rpx',
177 193 },
178 194 },
179 195 {
180   - type: 'text',
181   - text: '订单备注:',
  196 + type: 'view',
182 197 css: {
183   - width: '400rpx',
184   - height: '33rpx',
185   - fontSize: '24rpx',
186   - fontSamily: 'PingFangSC-Regular',
187   - color: '#999999',
188   - lineHeight: '33rpx',
189   - display: 'block',
190   - boxOrient: 'vertical',
191   - lineClamp: 1 /* 这里是超出几行省略 */,
192   - position: 'fixed',
193   - top: '477rpx',
194   - left: '75rpx',
  198 + width: '600rpx',
  199 + paddingLeft: '30rpx',
  200 + display: 'inline-block',
  201 + paddingTop: '20rpx',
  202 + height: '35rpx',
  203 + fontSize: '26rpx',
  204 + lineHeight: '1em',
195 205 },
  206 + views: [
  207 + {
  208 + type: 'text',
  209 + text: '需求车型:',
  210 + css: {
  211 + color: '#999999',
  212 + },
  213 + },
  214 + {
  215 + type: 'text',
  216 + text: formatSpecification,
  217 + css: {
  218 + paddingLeft: '15rpx',
  219 + color: '#2b2b2b',
  220 + },
  221 + },
  222 + ],
196 223 },
197 224 {
198   - type: 'text',
199   - text: params.remark,
  225 + type: 'view',
200 226 css: {
201   - width: '350rpx',
202   - height: '33rpx',
203   - fontSize: '24rpx',
204   - fontSamily: 'PingFangSC-Regular',
205   - color: '#121212',
206   - lineHeight: '33rpx',
207   - overflow: 'hidden',
208   - textOverflow: 'ellipsis',
209   - display: 'block',
210   - boxOrient: 'vertical',
211   - lineClamp: 1 /* 这里是超出几行省略 */,
212   - position: 'fixed',
213   - top: '477rpx',
214   - left: '195rpx',
  227 + width: '600rpx',
  228 + paddingLeft: '30rpx',
  229 + display: 'inline-block',
  230 + paddingTop: '20rpx',
  231 + height: '35rpx',
  232 + fontSize: '26rpx',
  233 + lineHeight: '1em',
215 234 },
  235 + views: [
  236 + {
  237 + type: 'text',
  238 + text: '需求箱型:',
  239 + css: {
  240 + color: '#999999',
  241 + },
  242 + },
  243 + {
  244 + type: 'text',
  245 + text: formatVanType,
  246 + css: {
  247 + paddingLeft: '15rpx',
  248 + color: '#2b2b2b',
  249 + },
  250 + },
  251 + ],
216 252 },
217 253 {
218   - type: 'text',
219   - text: '司 机:',
  254 + type: 'view',
220 255 css: {
221   - width: '400rpx',
222   - height: '33rpx',
  256 + width: '600rpx',
  257 + paddingLeft: '30rpx',
  258 + display: 'inline-block',
  259 + paddingTop: '20rpx',
  260 + height: '35rpx',
223 261 fontSize: '26rpx',
224   - fontSamily: 'PingFangSC-Regular',
225   - color: '#FFFFFF',
226   - lineHeight: '33rpx',
227   - display: 'block',
228   - boxOrient: 'vertical',
229   - lineClamp: 1 /* 这里是超出几行省略 */,
230   - position: 'fixed',
231   - top: '564rpx',
232   - left: '75rpx',
  262 + lineHeight: '1em',
233 263 },
  264 + views: [
  265 + {
  266 + type: 'text',
  267 + text: '货物信息:',
  268 + css: {
  269 + color: '#999999',
  270 + },
  271 + },
  272 + {
  273 + type: 'text',
  274 + text: detail.goodsName,
  275 + css: {
  276 + paddingLeft: '15rpx',
  277 + color: '#2b2b2b',
  278 + },
  279 + },
  280 + ],
234 281 },
235 282 {
236   - type: 'text',
237   - text: driverInfo,
  283 + type: 'view',
238 284 css: {
239   - width: '400rpx',
240   - height: '33rpx',
  285 + width: '600rpx',
  286 + paddingLeft: '30rpx',
  287 + display: 'inline-block',
  288 + paddingTop: '20rpx',
  289 + height: '35rpx',
241 290 fontSize: '26rpx',
242   - fontSamily: 'PingFangSC-Regular',
243   - color: '#FFFFFF',
244   - lineHeight: '33rpx',
245   - display: 'block',
246   - boxOrient: 'vertical',
247   - lineClamp: 1 /* 这里是超出几行省略 */,
248   - position: 'fixed',
249   - top: '564rpx',
250   - left: '180rpx',
  291 + lineHeight: '1em',
251 292 },
  293 + views: [
  294 + {
  295 + type: 'text',
  296 + text: '找车需求:',
  297 + css: {
  298 + color: '#999999',
  299 + },
  300 + },
  301 + {
  302 + type: 'text',
  303 + text: detail.priceType !== 'TON' ? `共${detail.vehicleNumber}车(` : `共${detail.goodsWeight}吨(`,
  304 + css: {
  305 + paddingLeft: '15rpx',
  306 + color: '#2b2b2b',
  307 + },
  308 + },
  309 + {
  310 + type: 'text',
  311 + text: detail.priceType !== 'TON' ? `还需${detail.remainVehicleNumber}车` : `剩余${detail.remainGoodsWeight}吨`,
  312 + css: {
  313 + paddingLeft: '15rpx',
  314 + color: '#ed3f3f',
  315 + },
  316 + },
  317 + {
  318 + type: 'text',
  319 + text: ')',
  320 + css: {
  321 + paddingLeft: '15rpx',
  322 + color: '#2b2b2b',
  323 + },
  324 + },
  325 + ],
252 326 },
253 327 {
254   - type: 'text',
255   - text: '车牌号:' + vehicle,
  328 + type: 'view',
256 329 css: {
257   - width: '400rpx',
258   - height: '33rpx',
  330 + width: '600rpx',
  331 + paddingLeft: '30rpx',
  332 + display: 'inline-block',
  333 + paddingTop: '20rpx',
  334 + height: '35rpx',
259 335 fontSize: '26rpx',
260   - fontSamily: 'PingFangSC-Regular',
261   - color: '#FFFFFF',
262   - lineHeight: '33rpx',
263   - display: 'block',
264   - boxOrient: 'vertical',
265   - lineClamp: 1 /* 这里是超出几行省略 */,
266   - position: 'fixed',
267   - top: '613rpx',
268   - left: '75rpx',
  336 + lineHeight: '1em',
269 337 },
  338 + views: [
  339 + {
  340 + type: 'text',
  341 + text: '运单备注:',
  342 + css: {
  343 + color: '#999999',
  344 + },
  345 + },
  346 + {
  347 + type: 'text',
  348 + text: detail.remark,
  349 + css: {
  350 + paddingLeft: '15rpx',
  351 + color: '#2b2b2b',
  352 + lineClamp: 1,
  353 + },
  354 + },
  355 + ],
270 356 },
271 357 ],
272 358 },
... ...
pages/index.vue
... ... @@ -5,7 +5,7 @@
5 5 <script>
6 6 export default {
7 7 onReady() {
8   - uni.switchTab({ url: '/pages/order/index' });
  8 + uni.switchTab({ url: '/pages/goodSource/index' });
9 9 },
10 10 };
11 11 </script>
... ...
pages/me/index.vue
... ... @@ -46,7 +46,16 @@
46 46 <view class="page-my__list">
47 47 <u-cell-group>
48 48 <!-- <u-cell v-if="$permission('/settlement/paymentPlan')" icon="file-text" title="支付申请" is-link url="/pages/payPlan/list"> </u-cell>-->
49   - <u-cell v-if="$permission('/settlement/paymentPlan')" icon="rmb" icon-style="color:#333" title-style="color:#333" title="支付计划" is-link url="/pages/payPlan/list"> </u-cell>
  49 + <u-cell
  50 + v-if="$permission('/settlement/paymentPlan')"
  51 + icon="https://zeyi-tms-product.oss-cn-hangzhou.aliyuncs.com/dispatch-helper-ma/svg/pay-rmb.svg"
  52 + icon-style="color:#333"
  53 + title-style="color:#333"
  54 + title="支付计划"
  55 + is-link
  56 + url="/pages/payPlan/list"
  57 + >
  58 + </u-cell>
50 59 </u-cell-group>
51 60 </view>
52 61 <view class="page-my__login">
... ...
pages/order/add.vue
... ... @@ -38,12 +38,23 @@
38 38 <u-input v-model="form.goodsPiece" border="none" type="digit" placeholder="请输入,选填" />
39 39 </u-form-item>
40 40 <u-form-item label="货物吨数" required>
41   - <u-input v-model="form.goodsWeight" border="none" type="digit" placeholder="请输入" />
  41 + <u-input v-model="form.goodsWeight" border="none" type="digit" placeholder="请输入" @change="computedPaid" />
42 42 </u-form-item>
43 43 <u-form-item label="货物方数">
44 44 <u-input v-model="form.goodsVolume" border="none" type="digit" placeholder="请输入,选填" />
45 45 </u-form-item>
46 46 </view>
  47 + <view class="card" v-if="form.priceType === 'TON'">
  48 + <u-form-item label="计价方式">
  49 + <render-dict style="color: #2b2a27" :value="form.priceType" dict="FREIGHT_GOODS_SOURCE_PRICE_TYPE"></render-dict>
  50 + </u-form-item>
  51 + <u-form-item label="运输单价">
  52 + <text style="color: #2b2a27"
  53 + ><text class="color-red">{{ form.weightUnitPrice }}</text
  54 + >元/吨</text
  55 + >
  56 + </u-form-item>
  57 + </view>
47 58 <view class="card">
48 59 <view style="display: flex">
49 60 <view style="flex: 1">
... ... @@ -185,6 +196,7 @@ export default {
185 196 components: { UTextarea, PopupPlatenumber, payee },
186 197 data() {
187 198 return {
  199 + eventCode: '',
188 200 loading: false,
189 201 showModal: '',
190 202 showModal2: '',
... ... @@ -221,6 +233,10 @@ export default {
221 233 allowDriverSeeFreightAmountNode: '',
222 234 waypoints: [{}, {}],
223 235 remark: '',
  236 + priceType: '',
  237 + weightUnitPrice: '',
  238 + goodsSourceCode: '',
  239 + goodsSourceBiddingCode: '',
224 240 },
225 241 payeeModel: {},
226 242 driverObj: {}, //司机信息
... ... @@ -246,21 +262,27 @@ export default {
246 262 },
247 263 },
248 264 onLoad(option) {
249   - if (option.code) {
250   - this.initData(option.code);
251   - }
252 265 // 从抢单来的数据
253 266 if (option.eventCode) {
  267 + this.eventCode = option.eventCode;
  268 + uni.setNavigationBarTitle({ title: '确定指派' });
254 269 const eventChannel = this.getOpenerEventChannel();
255 270 eventChannel.on('get-item', detail => {
256   - this.setFormValue(detail);
  271 + this.setFormValue(detail, ['priceType', 'weightUnitPrice', 'goodsSourceCode', 'goodsSourceBiddingCode', 'loadTime', 'paidAmount']);
  272 + this.getAllowDriverSeeFreightAmount();
  273 + this.clipboard(`手机号:${detail.driverMobile || ''}车牌:${detail.vehicleLicenseNum || ''}车挂:${detail.trailerLicenseNum || ''}`);
  274 + this.computedService();
257 275 });
  276 + } else {
  277 + if (option.code) {
  278 + this.initData(option.code);
  279 + }
  280 + this.initConfig();
258 281 }
259   - this.initConfig();
260 282 },
261 283 methods: {
262   - setFormValue(detail) {
263   - ['goodsName', 'waypoints', 'allowDriverSeeFreightAmountNode', 'projectCode', 'projectName', 'remark', 'goodsPiece', 'goodsWeight', 'goodsVolume'].forEach(key => {
  284 + setFormValue(detail, moreList = []) {
  285 + ['goodsName', 'waypoints', 'allowDriverSeeFreightAmountNode', 'projectCode', 'projectName', 'remark', 'goodsPiece', 'goodsWeight', 'goodsVolume', ...moreList].forEach(key => {
264 286 this.form[key] = detail[key];
265 287 });
266 288 if (detail.vehicleLicenseNum) {
... ... @@ -355,10 +377,7 @@ export default {
355 377 this.clipboard(this.content2);
356 378 },
357 379 initConfig() {
358   - uni.$u.api.freightOrder.currentFreight({}).then(en => {
359   - this.currentFreight = en?.result || {};
360   - this.form.allowDriverSeeFreightAmountNode = this.currentFreight.allowDriverSeeFreightAmountNode;
361   - });
  380 + this.getAllowDriverSeeFreightAmount();
362 381 uni.$u.api.filter.projectCode({}).then(res => {
363 382 if (res.success && res.result && res.result.length === 1) {
364 383 this.form.projectCode = res.result[0].code;
... ... @@ -366,6 +385,12 @@ export default {
366 385 }
367 386 });
368 387 },
  388 + getAllowDriverSeeFreightAmount() {
  389 + uni.$u.api.freightOrder.currentFreight({}).then(en => {
  390 + this.currentFreight = en?.result || {};
  391 + this.form.allowDriverSeeFreightAmountNode = this.currentFreight.allowDriverSeeFreightAmountNode;
  392 + });
  393 + },
369 394 initData(code) {
370 395 uni.$u.api.freightOrder.getDetail({ code }).then(res => {
371 396 let detail = res.result || {};
... ... @@ -567,6 +592,12 @@ export default {
567 592 computedService() {
568 593 uni.$u.debounce(this.getServiceAmountInfo, 500);
569 594 },
  595 + computedPaid() {
  596 + if (this.eventCode) {
  597 + this.form.paidAmount = Number(Number(this.form.goodsWeight) * Number(this.form.weightUnitPrice)).toFixed(2);
  598 + this.computedService();
  599 + }
  600 + },
570 601 getServiceAmountInfo() {
571 602 const { paidAmount = '', oilAmount = '', deliveryAmount = '', prepaidAmount = '', balancePaymentAmount = '', goodsName = '', goodsValue = '' } = this.form;
572 603 let params = {
... ... @@ -600,8 +631,8 @@ export default {
600 631 if (this.loading) return;
601 632 this.loading = true;
602 633 let totalAmount = Number(this.form.paidAmount || 0) + Number(this.form.serviceAmount || 0) + Number(this.form.securityServiceAmount || 0);
603   - uni.$u.api.freightOrder
604   - .add({ ...this.form, totalAmount, payeeId: this.payeeModel.driverId })
  634 + let addFun = this.eventCode ? uni.$u.api.freightGoodsSourceV2.addOrder : uni.$u.api.freightOrder.add;
  635 + addFun({ ...this.form, totalAmount, payeeId: this.payeeModel.driverId })
605 636 .then(res => {
606 637 if (res.success) {
607 638 this.form = {};
... ...
pages/order/detail.vue
... ... @@ -98,10 +98,37 @@
98 98 <view class="card__item_content">
99 99 <z-upload v-if="item.receiptAttachment" v-model="item.receiptAttachment" :limit="20" readonly disabled></z-upload>
100 100 </view>
101   - <view v-if="['COMPLETED'].includes(item.status) && $permission('/freightOrder/modifyReceiptAttachment')" class="action" @tap="toUploadReceipt">
  101 + <view v-if="['COMPLETED'].includes(item.status) && $permission('/freightOrder/modifyReceiptAttachment')" class="action" @tap="toUploadReceipt('receiptAttachment')">
102 102 <u--text text="修改" suffixIcon="arrow-right"></u--text>
103 103 </view>
104 104 </view>
  105 + <view v-if="item.priceType === 'TON'" class="card__item">
  106 + <view class="card__item_field">装车磅单</view>
  107 + <view class="card__item_content">
  108 + <z-upload v-if="item.departureWeightAttachment" v-model="item.departureWeightAttachment" :limit="20" readonly disabled></z-upload>
  109 + </view>
  110 + <view v-if="['COMPLETED'].includes(item.status) && $permission('/freightOrder/modifyDepartureWeightAttachment')" class="action" @tap="toUploadReceipt('departureWeightAttachment')">
  111 + <u--text text="修改" suffixIcon="arrow-right"></u--text>
  112 + </view>
  113 + </view>
  114 + <view v-if="item.priceType === 'TON'" class="card__item">
  115 + <view class="card__item_field">卸车磅单</view>
  116 + <view class="card__item_content">
  117 + <z-upload v-if="item.arrivalWeightAttachment" v-model="item.arrivalWeightAttachment" :limit="20" readonly disabled></z-upload>
  118 + </view>
  119 + <view v-if="['COMPLETED'].includes(item.status) && $permission('/freightOrder/modifyArrivalWeightAttachment')" class="action" @tap="toUploadReceipt('arrivalWeightAttachment')">
  120 + <u--text text="修改" suffixIcon="arrow-right"></u--text>
  121 + </view>
  122 + </view>
  123 + <view class="card__item">
  124 + <view class="card__item_field">计价方式</view>
  125 + <view class="card__item_content">
  126 + <view>
  127 + <render-dict dict="FREIGHT_GOODS_SOURCE_PRICE_TYPE" :value="item.priceType"></render-dict>
  128 + <span v-if="item.priceType === 'TON'">({{ item.weightUnitPrice }}元/吨)</span>
  129 + </view>
  130 + </view>
  131 + </view>
105 132 </view>
106 133 <view class="card">
107 134 <view class="card__header">
... ... @@ -406,9 +433,9 @@ export default {
406 433 },
407 434 });
408 435 },
409   - toUploadReceipt() {
  436 + toUploadReceipt(type = '') {
410 437 uni.navigateTo({
411   - url: '/pages/order/upload-receipt?code=' + this.item.code,
  438 + url: `/pages/order/upload-receipt?code=${this.item.code}&type=${type}`,
412 439 events: {
413 440 refreshData: () => {
414 441 this.initData(this.item.code);
... ...
pages/order/filter.vue
... ... @@ -49,7 +49,7 @@
49 49 </template>
50 50  
51 51 <script>
52   -import { urlParam } from '@/utils/param';
  52 +import { urlParam, formatBatchCode } from '@/utils/param';
53 53 export default {
54 54 name: 'order-filter',
55 55 props: {
... ... @@ -105,7 +105,7 @@ export default {
105 105 },
106 106 // 查询
107 107 inquiryChange() {
108   - this.getOpenerEventChannel().emit('refreshData', this.searchForm);
  108 + this.getOpenerEventChannel().emit('refreshData', { ...this.searchForm, code: formatBatchCode(this.searchForm.code) });
109 109 setTimeout(() => uni.navigateBack(), 500);
110 110 },
111 111 chosePayStatus() {
... ...
pages/order/index.vue
... ... @@ -65,9 +65,9 @@
65 65 </view>
66 66 </view>
67 67 </u-popup>
68   - <u-popup :show="qrShow" @close="qrShow = false" mode="center" closeable>
  68 + <u-popup :show="qrShow" @close="qrShow = false" mode="center" :closeable="false" :safe-area-inset-bottom="false">
69 69 <l-painter ref="painter" :board="poster"></l-painter>
70   - <view style="margin-top: 30upx">
  70 + <view style="margin: 30upx">
71 71 <u-button type="primary" @click="saveQrImage">保存</u-button>
72 72 </view>
73 73 </u-popup>
... ...
pages/order/upload-receipt.vue
... ... @@ -3,7 +3,7 @@
3 3 <template #content>
4 4 <u-form :model="form" ref="uForm" labelWidth="100">
5 5 <view class="card">
6   - <u-form-item label="上传回单">
  6 + <u-form-item :label="opType[type].title">
7 7 <z-upload v-model="form.receiptAttachment" :limit="20"></z-upload>
8 8 </u-form-item>
9 9 </view>
... ... @@ -24,13 +24,31 @@ export default {
24 24 components: { ZUpload },
25 25 data() {
26 26 return {
  27 + type: 'receiptAttachment',
27 28 form: {
28 29 receiptAttachment: '',
29 30 },
30 31 item: {},
  32 + opType: {
  33 + receiptAttachment: {
  34 + title: '上传回单',
  35 + url: 'modifyReceiptAttachment',
  36 + },
  37 + departureWeightAttachment: {
  38 + title: '装车磅单',
  39 + url: 'modifyDepartureWeightAttachment',
  40 + },
  41 + arrivalWeightAttachment: {
  42 + title: '卸车磅单',
  43 + url: 'modifyArrivalWeightAttachment',
  44 + },
  45 + },
31 46 };
32 47 },
33 48 onLoad(options) {
  49 + if (options.type) {
  50 + this.type = options.type;
  51 + }
34 52 if (options.code) {
35 53 this.initData(options.code);
36 54 }
... ... @@ -39,11 +57,11 @@ export default {
39 57 initData(code) {
40 58 uni.$u.api.freightOrder.getDetail({ code }).then(res => {
41 59 this.item = res.result || {};
42   - this.form.receiptAttachment = this.item.receiptAttachment;
  60 + this.form.receiptAttachment = this.item[this.type];
43 61 });
44 62 },
45 63 submit() {
46   - uni.$u.api.freightOrder.modifyReceiptAttachment({ code: this.item.code, ...this.form }).then(res => {
  64 + uni.$u.api.freightOrder[this.type]({ code: this.item.code, [this.type]: this.form.receiptAttachment }).then(res => {
47 65 if (res.success) {
48 66 uni.showToast({ title: '操作成功', icon: 'none' });
49 67 this.getOpenerEventChannel().emit('refreshData');
... ...
pages/payPlan/filter.vue
... ... @@ -35,7 +35,7 @@
35 35 </template>
36 36  
37 37 <script>
38   -import { urlParam } from '@/utils/param';
  38 +import { formatBatchCode, urlParam } from '@/utils/param';
39 39 export default {
40 40 name: 'payPlanFilter',
41 41 props: {
... ... @@ -87,7 +87,7 @@ export default {
87 87 },
88 88 // 查询
89 89 inquiryChange() {
90   - this.getOpenerEventChannel().emit('refreshData', this.searchForm);
  90 + this.getOpenerEventChannel().emit('refreshData', { ...this.searchForm, orderCode: formatBatchCode(this.searchForm.orderCode) });
91 91 setTimeout(() => uni.navigateBack(), 500);
92 92 },
93 93 },
... ...
pages/settlement/filter.vue
... ... @@ -52,7 +52,7 @@
52 52 </template>
53 53  
54 54 <script>
55   -import { urlParam } from '@/utils/param';
  55 +import { formatBatchCode, urlParam } from '@/utils/param';
56 56 export default {
57 57 name: 'settlement-filter',
58 58 props: {
... ... @@ -112,7 +112,7 @@ export default {
112 112 },
113 113 // 查询
114 114 inquiryChange() {
115   - this.getOpenerEventChannel().emit('refreshData', this.searchForm);
  115 + this.getOpenerEventChannel().emit('refreshData', { ...this.searchForm, orderCode: formatBatchCode(this.searchForm.orderCode) });
116 116 setTimeout(() => uni.navigateBack(), 500);
117 117 },
118 118 chosePayStatus() {
... ...
utils/param.js
... ... @@ -51,3 +51,7 @@ export const urlParam = data =&gt; {
51 51 export const clearURL = (str = '') => {
52 52 return str.replace(/^(\s|\/)+|(\s|\/)+$/g, '');
53 53 };
  54 +
  55 +export const formatBatchCode = val => {
  56 + return val ? val.replace(/,/, ',').replace(/\s+/g, ',') : '';
  57 +};
... ...