Commit aa0076c0ead6d635fd7b9f32b66ed781929fc71a

Authored by 史婷婷
1 parent cf88bbff

feat: 规格变更单-新增暂存

@@ -3,9 +3,10 @@ @@ -3,9 +3,10 @@
3 <scroll-view class="scroll" scroll-y> 3 <scroll-view class="scroll" scroll-y>
4 <uni-list> 4 <uni-list>
5 <view class="section"> 5 <view class="section">
6 - <uni-list-item title="订单编号">  
7 - <template v-slot:footer>  
8 - <view class="readonly-text">{{ form.orderNo }}</view> 6 + <uni-list-item class="select-item" :class="form.orderNo ? 'is-filled' : 'is-empty'" clickable
  7 + @click="openRelate('orderNo')" :rightText="form.orderNo || '请选择订单编号'" showArrow>
  8 + <template v-slot:body>
  9 + <view class="item-title"><text class="required">*</text><text>订单编号</text></view>
9 </template> 10 </template>
10 </uni-list-item> 11 </uni-list-item>
11 <uni-list-item title="供货单位"> 12 <uni-list-item title="供货单位">
@@ -138,62 +139,64 @@ @@ -138,62 +139,64 @@
138 <view class="view-total"> 139 <view class="view-total">
139 <view class="head">合计</view> 140 <view class="head">合计</view>
140 <view class="row"> 141 <view class="row">
141 - <text class="label">总数量</text><text class="value">{{ form.totalQuantity }}</text> 142 + <text class="label">总数量</text><text class="value">{{ form.afterTotalQuantity }}</text>
142 </view> 143 </view>
143 </view> 144 </view>
144 <button class="btn submit" type="primary" @click="onSubmit">提交</button> 145 <button class="btn submit" type="primary" @click="onSubmit">提交</button>
145 </view> 146 </view>
146 <SingleSelectSheet :visible.sync="sheet.visible" :title="sheet.title" :options="sheet.options" v-model="sheet.value" 147 <SingleSelectSheet :visible.sync="sheet.visible" :title="sheet.title" :options="sheet.options" v-model="sheet.value"
147 @confirm="onSheetConfirm" /> 148 @confirm="onSheetConfirm" />
  149 + <RelateSelectSheet :visible.sync="relate.visible" :title="relate.title" :source="relate.source"
  150 + :display-fields="relate.display" :multiple="relate.multiple" :row-key="relate.rowKey"
  151 + :selectedKeys.sync="relate.selectedKeys" :source-extra="{ queryType: 'CHANGE' }" @confirm="onRelateConfirm" />
148 </view> 152 </view>
149 </template> 153 </template>
150 154
151 <script> 155 <script>
152 -import { createApi } from '@/api/change_list.js' 156 +import { createApi, loadOrderApi } from '@/api/change_list.js'
153 import Product from './product.vue' 157 import Product from './product.vue'
154 import SingleSelectSheet from '@/components/single-select/index.vue' 158 import SingleSelectSheet from '@/components/single-select/index.vue'
  159 +import RelateSelectSheet from '@/components/relate-select/index.vue'
155 import { getDicName } from '@/utils/dic.js' 160 import { getDicName } from '@/utils/dic.js'
156 import { getDicByCodes } from '@/utils/dic' 161 import { getDicByCodes } from '@/utils/dic'
157 162
158 export default { 163 export default {
159 name: 'ChangeListAdd', 164 name: 'ChangeListAdd',
160 - components: { Product, SingleSelectSheet }, 165 + components: { Product, SingleSelectSheet, RelateSelectSheet },
161 data() { 166 data() {
162 return { 167 return {
163 form: { 168 form: {
164 - code: '',  
165 - supplier: '',  
166 - buyer: '',  
167 - // 默认当前日期 格式为 yyyy-MM-dd  
168 - orderDate: new Date().toISOString().substring(0, 10),  
169 - unit: '',  
170 - totalQuantity: '',  
171 - totalAmountExcludingTax: '',  
172 - totalAmountIncludingTax: '',  
173 - totalAmountCapital: '',  
174 - depositInfo: '',  
175 - packagingRequirements: '',  
176 - paymentTerms: '',  
177 - transportMode: '',  
178 - destinationId: [],  
179 - includesPackagingFee: '',  
180 - includesTransportFee: '',  
181 - designatedConsignee: '',  
182 - specialTerms: '', 169 + orderNo: '',
  170 + orderId: '',
  171 + supplyUnit: '',
  172 + orderingUnit: '',
  173 + orderDate: '',
  174 + workshopId: '',
  175 + settlementTerms: '',
  176 + deliveryMethod: '',
  177 + priceListNo: '',
  178 + invoicingStatus: '',
  179 + shippingCost: '',
  180 + packagingFee: '',
183 executionStandard: '', 181 executionStandard: '',
184 executionStandardRemarks: '', 182 executionStandardRemarks: '',
185 - specialInstructions: '',  
186 - remarks: '',  
187 - pieceWeightHead: '', 183 + totalQuantity: '',
  184 + afterTotalQuantity: '',
  185 + pieceWeightHeader: '',
188 surface: '', 186 surface: '',
189 tolerance: '', 187 tolerance: '',
190 performance: '', 188 performance: '',
191 - component: '', 189 + element: '',
192 packaging: '', 190 packaging: '',
  191 + remarks: '',
  192 + // 默认当前日期 格式为 yyyy-MM-dd
  193 + orderDate: new Date().toISOString().substring(0, 10),
  194 +
193 }, 195 },
194 initPurchaseOrderLineList: [], 196 initPurchaseOrderLineList: [],
195 dicOptions: { SUPPLIER: [], APPLICABLE_STANDARD: [] }, 197 dicOptions: { SUPPLIER: [], APPLICABLE_STANDARD: [] },
196 - sheet: { visible: false, title: '请选择', options: [], value: '', field: '' } 198 + sheet: { visible: false, title: '请选择', options: [], value: '', field: '' },
  199 + relate: { visible: false, title: '选择', source: '', display: [], multiple: false, rowKey: 'id', selectedKeys: [], fieldKey: '' }
197 } 200 }
198 }, 201 },
199 onLoad() { 202 onLoad() {
@@ -242,10 +245,74 @@ export default { @@ -242,10 +245,74 @@ export default {
242 } 245 }
243 this.sheet.visible = false 246 this.sheet.visible = false
244 }, 247 },
  248 + openRelate(fieldKey) {
  249 + let config = {}
  250 + if (fieldKey === 'orderNo') {
  251 + config = {
  252 + title: '订单',
  253 + source: 'orderAssoc',
  254 + rowKey: 'id',
  255 + multiple: false,
  256 + display: [
  257 + { label: '订单编号', field: 'orderNo' },
  258 + { label: '订货单位', field: 'orderingUnitName' },
  259 + { label: '生产厂', field: 'workshopName' },
  260 + { label: '办事处', field: 'deptName' },
  261 + { label: '总数量(kg)', field: 'totalQuantity' },
  262 + { label: '订货日期', field: 'orderDate' },
  263 + { label: '下单人', field: 'contractCreateByName' }
  264 + ]
  265 + }
  266 + }
  267 + const currentId = this.form && (this.form.id || this.form.code)
  268 + const selectedKeys = currentId ? [currentId] : []
  269 + this.sheet.visible = false
  270 + this.relate.title = config.title
  271 + this.relate.source = config.source
  272 + this.relate.display = config.display
  273 + this.relate.multiple = config.multiple
  274 + this.relate.rowKey = config.rowKey
  275 + this.relate.selectedKeys = selectedKeys
  276 + this.relate.fieldKey = fieldKey
  277 + this.$nextTick(() => { this.relate.visible = true })
  278 + },
  279 + async onRelateConfirm({ items }) {
  280 + const _fieldKey = this.relate.fieldKey
  281 + const first = (items && items.length > 0) ? items[0] : null
  282 + if (_fieldKey === 'orderNo') {
  283 + const id = first && (first.id || first.code)
  284 + if (id) {
  285 + try {
  286 + const res = await loadOrderApi([id])
  287 + const data = res && res.data ? res.data : null
  288 + const item = Array.isArray(data) ? (data[0] || {}) : (data || {})
  289 + const next = { ...this.form, ...item }
  290 + next.orderNo = next.orderNo || ((first && (first.orderNo || first.code)) || '');
  291 + next.orderId = next.id || '';
  292 + delete next.id
  293 + this.form = next
  294 + const lines = Array.isArray(item.purchaseOrderLineList) ? item.purchaseOrderLineList.map(x => ({ ...x, purchaseOrderId: x.id, id: '' })) : []
  295 + this.initPurchaseOrderLineList = lines
  296 + const sum = lines.reduce((acc, it) => {
  297 + const v = Number(it && it.quantity)
  298 + return acc + (isNaN(v) ? 0 : v)
  299 + }, 0)
  300 + this.form.afterTotalQuantity = sum
  301 + this.refreshStandardName()
  302 + } catch (e) {
  303 + this.form.orderNo = (first && (first.orderNo || first.code)) || ''
  304 + }
  305 + } else {
  306 + this.form.orderNo = (first && (first.orderNo || first.code)) || ''
  307 + }
  308 + }
  309 + },
245 getDicName: getDicName, 310 getDicName: getDicName,
246 async onSubmit() { 311 async onSubmit() {
247 const payload = { ...this.form } 312 const payload = { ...this.form }
248 console.log('onSubmit__payload', payload) 313 console.log('onSubmit__payload', payload)
  314 + payload.orderSpecList = payload.purchaseOrderLineList || [];
  315 + delete payload.purchaseOrderLineList;
249 try { 316 try {
250 await createApi(payload) 317 await createApi(payload)
251 uni.showToast({ title: '保存成功', icon: 'success' }) 318 uni.showToast({ title: '保存成功', icon: 'success' })
@@ -256,7 +323,12 @@ export default { @@ -256,7 +323,12 @@ export default {
256 }, 323 },
257 purchaseOrderLineListChange(data) { 324 purchaseOrderLineListChange(data) {
258 const list = Array.isArray(data) ? data : [] 325 const list = Array.isArray(data) ? data : []
259 - this.form.purchaseOrderLineList = list; 326 + this.form.purchaseOrderLineList = list
  327 + const sum = list.reduce((acc, it) => {
  328 + const v = Number(it && it.quantity)
  329 + return acc + (isNaN(v) ? 0 : v)
  330 + }, 0)
  331 + this.form.afterTotalQuantity = sum
260 }, 332 },
261 } 333 }
262 } 334 }
@@ -17,44 +17,89 @@ @@ -17,44 +17,89 @@
17 17
18 <view v-if="mode === 'add'" class="section"> 18 <view v-if="mode === 'add'" class="section">
19 <view v-for="(item, idx) in items" :key="'a-' + idx" class="block"> 19 <view v-for="(item, idx) in items" :key="'a-' + idx" class="block">
20 - <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>  
21 - <view class="row"><text class="label">品质</text><text class="value">{{ item.quality }}</text></view>  
22 - <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>  
23 -  
24 - <view v-show="!item.collapsed">  
25 - <!-- 厚(公差) * 宽(公差) * 长(公差) -->  
26 - <view class="row row-spec"><text class="label">规格(mm)</text>  
27 - <view class="value value-spec">  
28 - <view v-if="item.thickness" class="value-spec_val">{{ item.thickness }}</view>  
29 - <view v-if="item.thickness" class="value-spec_box">  
30 - <view v-if="item.thicknessTolPos" class="value-spec_box_1">+{{ item.thicknessTolPos }}  
31 - </view>  
32 - <view v-if="item.thicknessTolNeg" class="value-spec_box_2">-{{ item.thicknessTolNeg }}  
33 - </view>  
34 - </view>  
35 - <view v-if="item.width" class="value-spec_val p12">*</view>  
36 - <view v-if="item.width" class="value-spec_val">{{ item.width }}</view>  
37 - <view v-if="item.width" class="value-spec_box">  
38 - <view v-if="item.widthTolPos" class="value-spec_box_1">+{{ item.widthTolPos }}</view>  
39 - <view v-if="item.widthTolNeg" class="value-spec_box_2">-{{ item.widthTolNeg }}</view>  
40 - </view>  
41 - <view v-if="item.length" class="value-spec_val p12">*</view>  
42 - <view v-if="item.length" class="value-spec_val">{{ item.length }}</view>  
43 - <view v-if="item.length" class="value-spec_box">  
44 - <view v-if="item.lengthTolPos" class="value-spec_box_1">+{{ item.lengthTolPos }}</view>  
45 - <view v-if="item.lengthTolNeg" class="value-spec_box_2">-{{ item.lengthTolNeg }}</view>  
46 - </view>  
47 - </view>  
48 - </view>  
49 - <view class="row"><text class="label">状态</text><text class="value">{{ item.status }}</text></view>  
50 - <view class="row" :class="{ 'noneStyle': !item.showSalesPrice }"><text  
51 - class="label">数量kg</text><text class="value">{{ item.quantity }}</text>  
52 - </view>  
53 - <view class="row" :class="{ 'noneStyle': item.showSalesPrice }" v-if="item.showSalesPrice"><text  
54 - class="label">销售价格</text><text class="value">{{  
55 - item.salesPrice }}</text></view>  
56 -  
57 - <uni-list class="edit-list"> 20 + <uni-list class="edit-list">
  21 + <uni-list-item title="行业">
  22 + <template v-slot:footer>
  23 + <uni-easyinput v-model="item.industry" placeholder="请输入行业" :inputBorder="false" />
  24 + </template>
  25 + </uni-list-item>
  26 + <uni-list-item title="品质">
  27 + <template v-slot:footer>
  28 + <uni-easyinput v-model="item.quality" placeholder="请输入品质" :inputBorder="false" />
  29 + </template>
  30 + </uni-list-item>
  31 + <uni-list-item title="牌号">
  32 + <template v-slot:footer>
  33 + <uni-easyinput v-model="item.brand" placeholder="请输入牌号" :inputBorder="false" />
  34 + </template>
  35 + </uni-list-item>
  36 + <view v-show="!item.collapsed">
  37 + <uni-list-item title="厚度">
  38 + <template v-slot:footer>
  39 + <uni-easyinput v-model="item.thickness" placeholder="请输入厚度" :inputBorder="false" />
  40 + </template>
  41 + </uni-list-item>
  42 + <uni-list-item title="厚度公差 +">
  43 + <template v-slot:footer>
  44 + <uni-easyinput v-model="item.thicknessTolPos" placeholder="请输入厚度公差 +"
  45 + :inputBorder="false" />
  46 + </template>
  47 + </uni-list-item>
  48 + <uni-list-item title="厚度公差 -">
  49 + <template v-slot:footer>
  50 + <uni-easyinput v-model="item.thicknessTolNeg" placeholder="请输入厚度公差 -"
  51 + :inputBorder="false" />
  52 + </template>
  53 + </uni-list-item>
  54 + <uni-list-item title="宽度">
  55 + <template v-slot:footer>
  56 + <uni-easyinput v-model="item.width" placeholder="请输入宽度" :inputBorder="false" />
  57 + </template>
  58 + </uni-list-item>
  59 + <uni-list-item title="宽度公差 +">
  60 + <template v-slot:footer>
  61 + <uni-easyinput v-model="item.widthTolPos" placeholder="请输入宽度公差 +"
  62 + :inputBorder="false" />
  63 + </template>
  64 + </uni-list-item>
  65 + <uni-list-item title="宽度公差 -">
  66 + <template v-slot:footer>
  67 + <uni-easyinput v-model="item.widthTolNeg" placeholder="请输入宽度公差 -"
  68 + :inputBorder="false" />
  69 + </template>
  70 + </uni-list-item>
  71 + <uni-list-item title="长度">
  72 + <template v-slot:footer>
  73 + <uni-easyinput v-model="item.length" placeholder="请输入长度" :inputBorder="false" />
  74 + </template>
  75 + </uni-list-item>
  76 + <uni-list-item title="长度公差 +">
  77 + <template v-slot:footer>
  78 + <uni-easyinput v-model="item.lengthTolPos" placeholder="请输入长度公差 +"
  79 + :inputBorder="false" />
  80 + </template>
  81 + </uni-list-item>
  82 + <uni-list-item title="长度公差 -">
  83 + <template v-slot:footer>
  84 + <uni-easyinput v-model="item.lengthTolNeg" placeholder="请输入长度公差 -"
  85 + :inputBorder="false" />
  86 + </template>
  87 + </uni-list-item>
  88 + <uni-list-item title="状态">
  89 + <template v-slot:footer>
  90 + <uni-easyinput v-model="item.status" placeholder="请输入状态" :inputBorder="false" />
  91 + </template>
  92 + </uni-list-item>
  93 + <uni-list-item title="数量kg">
  94 + <template v-slot:footer>
  95 + <uni-easyinput v-model="item.quantity" placeholder="请输入数量kg" :inputBorder="false" />
  96 + </template>
  97 + </uni-list-item>
  98 + <uni-list-item v-if="item.showSalesPrice" title="销售价格">
  99 + <template v-slot:footer>
  100 + <uni-easyinput v-model="item.salesPrice" placeholder="请输入销售价格" :inputBorder="false" />
  101 + </template>
  102 + </uni-list-item>
58 <uni-list-item title="发货日期"> 103 <uni-list-item title="发货日期">
59 <template v-slot:footer> 104 <template v-slot:footer>
60 <uni-datetime-picker type="date" v-model="item.deliveryDate" /> 105 <uni-datetime-picker type="date" v-model="item.deliveryDate" />
@@ -66,11 +111,11 @@ @@ -66,11 +111,11 @@
66 :inputBorder="false" /> 111 :inputBorder="false" />
67 </template> 112 </template>
68 </uni-list-item> 113 </uni-list-item>
69 - </uni-list>  
70 - </view> 114 + </view>
  115 + </uni-list>
71 116
72 <view class="block-ops"> 117 <view class="block-ops">
73 - <div class="del" @click="onRemove(item.personId)"> 118 + <div class="del" @click="onRemove(item.purchaseOrderId)">
74 <image src="/static/images/delete.png" class="icon" /> 119 <image src="/static/images/delete.png" class="icon" />
75 删除 120 删除
76 </div> 121 </div>
@@ -188,7 +233,29 @@ export default { @@ -188,7 +233,29 @@ export default {
188 }, 233 },
189 methods: { 234 methods: {
190 defaultItem() { 235 defaultItem() {
191 - return { personId: uuid(), name: '', sex: '', sexName: '', nativePlace: '', age: '', position: '', mobile: '', phone: '', email: '', address: '', collapsed: false } 236 + return {
  237 + id: '',
  238 + purchaseOrderId: uuid(),
  239 + collapsed: false,
  240 + industry: '',
  241 + quality: '',
  242 + brand: '',
  243 + thickness: '',
  244 + thicknessTolPos: '',
  245 + thicknessTolNeg: '',
  246 + width: '',
  247 + widthTolPos: '',
  248 + widthTolNeg: '',
  249 + length: '',
  250 + lengthTolPos: '',
  251 + lengthTolNeg: '',
  252 + status: '',
  253 + quantity: '',
  254 + salesPrice: '',
  255 + showSalesPrice: false,
  256 + deliveryDate: '',
  257 + assessmentExceedsAgreement: ''
  258 + }
192 }, 259 },
193 getSexName(item) { 260 getSexName(item) {
194 const opts = this.selectOptions 261 const opts = this.selectOptions
@@ -235,7 +302,7 @@ export default { @@ -235,7 +302,7 @@ export default {
235 cancelText: '取消', 302 cancelText: '取消',
236 success: (res) => { 303 success: (res) => {
237 if (res && res.confirm) { 304 if (res && res.confirm) {
238 - const i = this.items.findIndex(it => String(it.personId) === String(id)) 305 + const i = this.items.findIndex(it => String(it.purchaseOrderId) === String(id))
239 if (i >= 0) { 306 if (i >= 0) {
240 this.items.splice(i, 1) 307 this.items.splice(i, 1)
241 this.emitChange() 308 this.emitChange()
@@ -316,10 +383,13 @@ export default { @@ -316,10 +383,13 @@ export default {
316 margin-right: 16rpx; 383 margin-right: 16rpx;
317 } 384 }
318 385
319 -  
320 ::v-deep .uni-list { 386 ::v-deep .uni-list {
321 background: transparent; 387 background: transparent;
322 388
  389 + .uni-list--border-top {
  390 + background-color: transparent !important;
  391 + }
  392 +
323 &-item { 393 &-item {
324 &__extra-text { 394 &__extra-text {
325 font-size: 32rpx; 395 font-size: 32rpx;
@@ -487,7 +557,7 @@ export default { @@ -487,7 +557,7 @@ export default {
487 557
488 .block { 558 .block {
489 background: #ffffff; 559 background: #ffffff;
490 - padding: 32rpx 0; 560 + // padding: 32rpx 0;
491 margin-bottom: 20rpx; 561 margin-bottom: 20rpx;
492 562
493 &:last-child { 563 &:last-child {