Commit 706855b31911a6408e3f94161ca1740cc7e32a73
1 parent
7eccee4a
commit:锁规时具体质量要求;合同关联历史记录问题不追加;新增顺序问题
Showing
15 changed files
with
225 additions
and
50 deletions
| @@ -296,6 +296,7 @@ export default { | @@ -296,6 +296,7 @@ export default { | ||
| 296 | customerRemarks: [], | 296 | customerRemarks: [], |
| 297 | defaultRemark: '', | 297 | defaultRemark: '', |
| 298 | regionOptions: [], | 298 | regionOptions: [], |
| 299 | + qualityReqSeq: 0, | ||
| 299 | } | 300 | } |
| 300 | }, | 301 | }, |
| 301 | onLoad(query) { | 302 | onLoad(query) { |
| @@ -468,13 +469,17 @@ export default { | @@ -468,13 +469,17 @@ export default { | ||
| 468 | if (!this.form.buyer || !id) { | 469 | if (!this.form.buyer || !id) { |
| 469 | return; | 470 | return; |
| 470 | } | 471 | } |
| 472 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 473 | + const seq = this.qualityReqSeq | ||
| 471 | try { | 474 | try { |
| 472 | const result = await getCustomerSpecificQualityRequirements({ | 475 | const result = await getCustomerSpecificQualityRequirements({ |
| 473 | customerId: this.form.buyer, | 476 | customerId: this.form.buyer, |
| 474 | productIdList:id, | 477 | productIdList:id, |
| 475 | }); | 478 | }); |
| 479 | + if (seq !== this.qualityReqSeq) return | ||
| 476 | this.updateFormData(result.data || {}); | 480 | this.updateFormData(result.data || {}); |
| 477 | } catch (error) { | 481 | } catch (error) { |
| 482 | + if (seq !== this.qualityReqSeq) return | ||
| 478 | console.error('获取客户质量要求失败:', error); | 483 | console.error('获取客户质量要求失败:', error); |
| 479 | // 可以根据需要添加错误提示逻辑 | 484 | // 可以根据需要添加错误提示逻辑 |
| 480 | this.$message.error('获取历史数据失败,请稍后重试'); | 485 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -491,7 +496,7 @@ export default { | @@ -491,7 +496,7 @@ export default { | ||
| 491 | 'tolerance', | 496 | 'tolerance', |
| 492 | ]; | 497 | ]; |
| 493 | fields.forEach((field) => { | 498 | fields.forEach((field) => { |
| 494 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 499 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 495 | }); | 500 | }); |
| 496 | }, | 501 | }, |
| 497 | onProductsChange(products) { | 502 | onProductsChange(products) { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -162,7 +162,7 @@ | @@ -162,7 +162,7 @@ | ||
| 162 | </view> | 162 | </view> |
| 163 | 163 | ||
| 164 | <view v-else class="view-list" v-show="!collapsedView"> | 164 | <view v-else class="view-list" v-show="!collapsedView"> |
| 165 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 165 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 166 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> | 166 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> |
| 167 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> | 167 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> |
| 168 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> | 168 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> |
| @@ -262,20 +262,22 @@ export default { | @@ -262,20 +262,22 @@ export default { | ||
| 262 | }, | 262 | }, |
| 263 | list: { | 263 | list: { |
| 264 | handler(v) { | 264 | handler(v) { |
| 265 | - // const arr = Array.isArray(v) ? v : [] | ||
| 266 | - // this.items = arr.map(x => ({ ...this.defaultItem(), ...x, collapsed: true })) | ||
| 267 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | 265 | + const arr = Array.isArray(v) ? v : [] |
| 266 | + this.items = arr.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 268 | console.log('v', v) | 267 | console.log('v', v) |
| 269 | }, | 268 | }, |
| 270 | deep: true | 269 | deep: true |
| 271 | } | 270 | } |
| 272 | }, | 271 | }, |
| 273 | created() { | 272 | created() { |
| 274 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 273 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 275 | this.items = init | 274 | this.items = init |
| 276 | this.recalculateAll() | 275 | this.recalculateAll() |
| 277 | }, | 276 | }, |
| 278 | methods: { | 277 | methods: { |
| 278 | + newKey() { | ||
| 279 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 280 | + }, | ||
| 279 | defaultItem() { | 281 | defaultItem() { |
| 280 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', processingFee: undefined, totalAmount: 0, deliveryDate: '', sampleOrder: false } | 282 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', processingFee: undefined, totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 281 | }, | 283 | }, |
| @@ -439,8 +441,9 @@ export default { | @@ -439,8 +441,9 @@ export default { | ||
| 439 | onAdd() { | 441 | onAdd() { |
| 440 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 442 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 441 | const obj = this.defaultItem() | 443 | const obj = this.defaultItem() |
| 444 | + obj._key = this.newKey() | ||
| 442 | obj.collapsed = true | 445 | obj.collapsed = true |
| 443 | - this.items.push(obj) | 446 | + this.items.unshift(obj) |
| 444 | this.emitChange() | 447 | this.emitChange() |
| 445 | }, | 448 | }, |
| 446 | onRemove(idx) { | 449 | onRemove(idx) { |
| @@ -298,6 +298,7 @@ export default { | @@ -298,6 +298,7 @@ export default { | ||
| 298 | customerRemarks: [], | 298 | customerRemarks: [], |
| 299 | defaultRemark: '', | 299 | defaultRemark: '', |
| 300 | regionOptions: [], | 300 | regionOptions: [], |
| 301 | + qualityReqSeq: 0, | ||
| 301 | } | 302 | } |
| 302 | }, | 303 | }, |
| 303 | onLoad(query) { | 304 | onLoad(query) { |
| @@ -470,13 +471,17 @@ export default { | @@ -470,13 +471,17 @@ export default { | ||
| 470 | if (!this.form.buyer || !id) { | 471 | if (!this.form.buyer || !id) { |
| 471 | return; | 472 | return; |
| 472 | } | 473 | } |
| 474 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 475 | + const seq = this.qualityReqSeq | ||
| 473 | try { | 476 | try { |
| 474 | const result = await getCustomerSpecificQualityRequirements({ | 477 | const result = await getCustomerSpecificQualityRequirements({ |
| 475 | customerId: this.form.buyer, | 478 | customerId: this.form.buyer, |
| 476 | productIdList:id, | 479 | productIdList:id, |
| 477 | }); | 480 | }); |
| 481 | + if (seq !== this.qualityReqSeq) return | ||
| 478 | this.updateFormData(result.data || {}); | 482 | this.updateFormData(result.data || {}); |
| 479 | } catch (error) { | 483 | } catch (error) { |
| 484 | + if (seq !== this.qualityReqSeq) return | ||
| 480 | console.error('获取客户质量要求失败:', error); | 485 | console.error('获取客户质量要求失败:', error); |
| 481 | // 可以根据需要添加错误提示逻辑 | 486 | // 可以根据需要添加错误提示逻辑 |
| 482 | this.$message.error('获取历史数据失败,请稍后重试'); | 487 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -494,7 +499,7 @@ export default { | @@ -494,7 +499,7 @@ export default { | ||
| 494 | 'tolerance', | 499 | 'tolerance', |
| 495 | ]; | 500 | ]; |
| 496 | fields.forEach((field) => { | 501 | fields.forEach((field) => { |
| 497 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 502 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 498 | }); | 503 | }); |
| 499 | }, | 504 | }, |
| 500 | onProductsChange(products) { | 505 | onProductsChange(products) { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -164,7 +164,7 @@ | @@ -164,7 +164,7 @@ | ||
| 164 | </view> | 164 | </view> |
| 165 | 165 | ||
| 166 | <view v-else class="view-list" v-show="!collapsedView"> | 166 | <view v-else class="view-list" v-show="!collapsedView"> |
| 167 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 167 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 168 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> | 168 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> |
| 169 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> | 169 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> |
| 170 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> | 170 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> |
| @@ -242,16 +242,14 @@ export default { | @@ -242,16 +242,14 @@ export default { | ||
| 242 | }, | 242 | }, |
| 243 | list: { | 243 | list: { |
| 244 | handler(v) { | 244 | handler(v) { |
| 245 | - // const arr = Array.isArray(v) ? v : [] | ||
| 246 | - // this.items = arr.map(x => ({ ...this.defaultItem(), ...x, collapsed: true })) | ||
| 247 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 248 | - console.log('v', v) | 245 | + const arr = Array.isArray(v) ? v : [] |
| 246 | + this.items = arr.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 249 | }, | 247 | }, |
| 250 | deep: true | 248 | deep: true |
| 251 | } | 249 | } |
| 252 | }, | 250 | }, |
| 253 | created() { | 251 | created() { |
| 254 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 252 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 255 | this.items = init | 253 | this.items = init |
| 256 | this.recalculateAll() | 254 | this.recalculateAll() |
| 257 | }, | 255 | }, |
| @@ -278,6 +276,9 @@ export default { | @@ -278,6 +276,9 @@ export default { | ||
| 278 | } | 276 | } |
| 279 | }, | 277 | }, |
| 280 | methods: { | 278 | methods: { |
| 279 | + newKey() { | ||
| 280 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 281 | + }, | ||
| 281 | defaultItem() { | 282 | defaultItem() { |
| 282 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', processingFee: undefined, totalAmount: 0, deliveryDate: '', sampleOrder: false } | 283 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', processingFee: undefined, totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 283 | }, | 284 | }, |
| @@ -409,8 +410,9 @@ export default { | @@ -409,8 +410,9 @@ export default { | ||
| 409 | onAdd() { | 410 | onAdd() { |
| 410 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 411 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 411 | const obj = this.defaultItem() | 412 | const obj = this.defaultItem() |
| 413 | + obj._key = this.newKey() | ||
| 412 | obj.collapsed = true | 414 | obj.collapsed = true |
| 413 | - this.items.push(obj) | 415 | + this.items.unshift(obj) |
| 414 | this.emitChange() | 416 | this.emitChange() |
| 415 | }, | 417 | }, |
| 416 | onRemove(idx) { | 418 | onRemove(idx) { |
| @@ -296,6 +296,7 @@ export default { | @@ -296,6 +296,7 @@ export default { | ||
| 296 | customerRemarks: [], | 296 | customerRemarks: [], |
| 297 | defaultRemark: '', | 297 | defaultRemark: '', |
| 298 | regionOptions: [], | 298 | regionOptions: [], |
| 299 | + qualityReqSeq: 0, | ||
| 299 | } | 300 | } |
| 300 | }, | 301 | }, |
| 301 | onLoad(query) { | 302 | onLoad(query) { |
| @@ -468,13 +469,17 @@ export default { | @@ -468,13 +469,17 @@ export default { | ||
| 468 | if (!this.form.buyer || !id) { | 469 | if (!this.form.buyer || !id) { |
| 469 | return; | 470 | return; |
| 470 | } | 471 | } |
| 472 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 473 | + const seq = this.qualityReqSeq | ||
| 471 | try { | 474 | try { |
| 472 | const result = await getCustomerSpecificQualityRequirements({ | 475 | const result = await getCustomerSpecificQualityRequirements({ |
| 473 | customerId: this.form.buyer, | 476 | customerId: this.form.buyer, |
| 474 | productIdList:id, | 477 | productIdList:id, |
| 475 | }); | 478 | }); |
| 479 | + if (seq !== this.qualityReqSeq) return | ||
| 476 | this.updateFormData(result.data || {}); | 480 | this.updateFormData(result.data || {}); |
| 477 | } catch (error) { | 481 | } catch (error) { |
| 482 | + if (seq !== this.qualityReqSeq) return | ||
| 478 | console.error('获取客户质量要求失败:', error); | 483 | console.error('获取客户质量要求失败:', error); |
| 479 | // 可以根据需要添加错误提示逻辑 | 484 | // 可以根据需要添加错误提示逻辑 |
| 480 | this.$message.error('获取历史数据失败,请稍后重试'); | 485 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -492,7 +497,7 @@ export default { | @@ -492,7 +497,7 @@ export default { | ||
| 492 | 'tolerance', | 497 | 'tolerance', |
| 493 | ]; | 498 | ]; |
| 494 | fields.forEach((field) => { | 499 | fields.forEach((field) => { |
| 495 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 500 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 496 | }); | 501 | }); |
| 497 | }, | 502 | }, |
| 498 | onProductsChange(products) { | 503 | onProductsChange(products) { |
| @@ -2,6 +2,43 @@ | @@ -2,6 +2,43 @@ | ||
| 2 | <view class="page"> | 2 | <view class="page"> |
| 3 | <scroll-view class="scroll" scroll-y> | 3 | <scroll-view class="scroll" scroll-y> |
| 4 | <view class="lock-page"> | 4 | <view class="lock-page"> |
| 5 | + <view class="block"> | ||
| 6 | + <view class="block-header"> | ||
| 7 | + <text class="block-title">具体质量要求</text> | ||
| 8 | + </view> | ||
| 9 | + <uni-list> | ||
| 10 | + <uni-list-item title="件重条头"> | ||
| 11 | + <template v-slot:footer> | ||
| 12 | + <uni-easyinput v-model="qualityForm.pieceWeightHead" placeholder="请输入" /> | ||
| 13 | + </template> | ||
| 14 | + </uni-list-item> | ||
| 15 | + <uni-list-item title="表面"> | ||
| 16 | + <template v-slot:footer> | ||
| 17 | + <uni-easyinput v-model="qualityForm.surface" placeholder="请输入" /> | ||
| 18 | + </template> | ||
| 19 | + </uni-list-item> | ||
| 20 | + <uni-list-item title="公差"> | ||
| 21 | + <template v-slot:footer> | ||
| 22 | + <uni-easyinput v-model="qualityForm.tolerance" placeholder="请输入" /> | ||
| 23 | + </template> | ||
| 24 | + </uni-list-item> | ||
| 25 | + <uni-list-item title="性能"> | ||
| 26 | + <template v-slot:footer> | ||
| 27 | + <uni-easyinput v-model="qualityForm.performance" placeholder="请输入" /> | ||
| 28 | + </template> | ||
| 29 | + </uni-list-item> | ||
| 30 | + <uni-list-item title="成分"> | ||
| 31 | + <template v-slot:footer> | ||
| 32 | + <uni-easyinput v-model="qualityForm.component" placeholder="请输入" /> | ||
| 33 | + </template> | ||
| 34 | + </uni-list-item> | ||
| 35 | + <uni-list-item title="包装"> | ||
| 36 | + <template v-slot:footer> | ||
| 37 | + <uni-easyinput v-model="qualityForm.packaging" placeholder="请输入" /> | ||
| 38 | + </template> | ||
| 39 | + </uni-list-item> | ||
| 40 | + </uni-list> | ||
| 41 | + </view> | ||
| 5 | <view class="block" v-for="(item, idx) in items" :key="item.raw && (item.raw.id || item.raw.lineId || item.raw.productId) || ('row-' + idx)"> | 42 | <view class="block" v-for="(item, idx) in items" :key="item.raw && (item.raw.id || item.raw.lineId || item.raw.productId) || ('row-' + idx)"> |
| 6 | <view class="block-header"> | 43 | <view class="block-header"> |
| 7 | <uni-data-checkbox multiple mode="default" :localdata="[{ text: '锁规', value: 'LOCKED' }]" | 44 | <uni-data-checkbox multiple mode="default" :localdata="[{ text: '锁规', value: 'LOCKED' }]" |
| @@ -193,6 +230,14 @@ export default { | @@ -193,6 +230,14 @@ export default { | ||
| 193 | planQty: 30, | 230 | planQty: 30, |
| 194 | sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' }, | 231 | sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' }, |
| 195 | options: [], | 232 | options: [], |
| 233 | + qualityForm: { | ||
| 234 | + pieceWeightHead: '', | ||
| 235 | + surface: '', | ||
| 236 | + tolerance: '', | ||
| 237 | + performance: '', | ||
| 238 | + component: '', | ||
| 239 | + packaging: '' | ||
| 240 | + } | ||
| 196 | } | 241 | } |
| 197 | }, | 242 | }, |
| 198 | computed: { | 243 | computed: { |
| @@ -280,6 +325,14 @@ export default { | @@ -280,6 +325,14 @@ export default { | ||
| 280 | try { | 325 | try { |
| 281 | const res = await getContractApi(this.id) | 326 | const res = await getContractApi(this.id) |
| 282 | const data = res && res.data ? res.data : {} | 327 | const data = res && res.data ? res.data : {} |
| 328 | + this.qualityForm = { | ||
| 329 | + pieceWeightHead: data.pieceWeightHead || '', | ||
| 330 | + surface: data.surface || '', | ||
| 331 | + tolerance: data.tolerance || '', | ||
| 332 | + performance: data.performance || '', | ||
| 333 | + component: data.component || '', | ||
| 334 | + packaging: data.packaging || '' | ||
| 335 | + } | ||
| 283 | const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : [] | 336 | const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : [] |
| 284 | const init = lines.map(v => ({ | 337 | const init = lines.map(v => ({ |
| 285 | locked: false, | 338 | locked: false, |
| @@ -465,6 +518,12 @@ export default { | @@ -465,6 +518,12 @@ export default { | ||
| 465 | totalAmountIncludingTax: this.totalAmountIncludingTax, | 518 | totalAmountIncludingTax: this.totalAmountIncludingTax, |
| 466 | totalQuantity: this.totalQuantity, | 519 | totalQuantity: this.totalQuantity, |
| 467 | type: 'INTL_OPEN_SPEC_AGMT', | 520 | type: 'INTL_OPEN_SPEC_AGMT', |
| 521 | + pieceWeightHead: this.qualityForm.pieceWeightHead, | ||
| 522 | + surface: this.qualityForm.surface, | ||
| 523 | + tolerance: this.qualityForm.tolerance, | ||
| 524 | + performance: this.qualityForm.performance, | ||
| 525 | + component: this.qualityForm.component, | ||
| 526 | + packaging: this.qualityForm.packaging, | ||
| 468 | contractDistributorLineList: selected | 527 | contractDistributorLineList: selected |
| 469 | } | 528 | } |
| 470 | 529 | ||
| @@ -548,6 +607,9 @@ export default { | @@ -548,6 +607,9 @@ export default { | ||
| 548 | margin-left: 12rpx; | 607 | margin-left: 12rpx; |
| 549 | font-size: 28rpx; | 608 | font-size: 28rpx; |
| 550 | color: rgba(0, 0, 0, 0.9); | 609 | color: rgba(0, 0, 0, 0.9); |
| 610 | + font-weight: 600; | ||
| 611 | + font-size: 20px; | ||
| 612 | + color: rgba(0, 0, 0, 0.9); | ||
| 551 | } | 613 | } |
| 552 | 614 | ||
| 553 | .ops { | 615 | .ops { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -162,7 +162,7 @@ | @@ -162,7 +162,7 @@ | ||
| 162 | </view> | 162 | </view> |
| 163 | 163 | ||
| 164 | <view v-else class="view-list" v-show="!collapsedView"> | 164 | <view v-else class="view-list" v-show="!collapsedView"> |
| 165 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 165 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 166 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> | 166 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> |
| 167 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> | 167 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> |
| 168 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> | 168 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> |
| @@ -258,20 +258,21 @@ export default { | @@ -258,20 +258,21 @@ export default { | ||
| 258 | }, | 258 | }, |
| 259 | list: { | 259 | list: { |
| 260 | handler(v) { | 260 | handler(v) { |
| 261 | - // const arr = Array.isArray(v) ? v : [] | ||
| 262 | - // this.items = arr.map(x => ({ ...this.defaultItem(), ...x, collapsed: true })) | ||
| 263 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 264 | - console.log('v', v) | 261 | + const arr = Array.isArray(v) ? v : [] |
| 262 | + this.items = arr.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 265 | }, | 263 | }, |
| 266 | deep: true | 264 | deep: true |
| 267 | } | 265 | } |
| 268 | }, | 266 | }, |
| 269 | created() { | 267 | created() { |
| 270 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 268 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 271 | this.items = init | 269 | this.items = init |
| 272 | this.recalculateAll() | 270 | this.recalculateAll() |
| 273 | }, | 271 | }, |
| 274 | methods: { | 272 | methods: { |
| 273 | + newKey() { | ||
| 274 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 275 | + }, | ||
| 275 | defaultItem() { | 276 | defaultItem() { |
| 276 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', totalAmount: 0, deliveryDate: '', sampleOrder: false } | 277 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 277 | }, | 278 | }, |
| @@ -446,8 +447,9 @@ export default { | @@ -446,8 +447,9 @@ export default { | ||
| 446 | onAdd() { | 447 | onAdd() { |
| 447 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 448 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 448 | const obj = this.defaultItem() | 449 | const obj = this.defaultItem() |
| 450 | + obj._key = this.newKey() | ||
| 449 | obj.collapsed = true | 451 | obj.collapsed = true |
| 450 | - this.items.push(obj) | 452 | + this.items.unshift(obj) |
| 451 | this.emitChange() | 453 | this.emitChange() |
| 452 | }, | 454 | }, |
| 453 | onRemove(idx) { | 455 | onRemove(idx) { |
| @@ -299,6 +299,7 @@ export default { | @@ -299,6 +299,7 @@ export default { | ||
| 299 | rawToProdRatioList: [], | 299 | rawToProdRatioList: [], |
| 300 | rawProductList: [], | 300 | rawProductList: [], |
| 301 | rawProductGradeList: [], | 301 | rawProductGradeList: [], |
| 302 | + qualityReqSeq: 0, | ||
| 302 | } | 303 | } |
| 303 | }, | 304 | }, |
| 304 | onLoad(query) { | 305 | onLoad(query) { |
| @@ -471,13 +472,17 @@ export default { | @@ -471,13 +472,17 @@ export default { | ||
| 471 | if (!this.form.buyer || !id) { | 472 | if (!this.form.buyer || !id) { |
| 472 | return; | 473 | return; |
| 473 | } | 474 | } |
| 475 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 476 | + const seq = this.qualityReqSeq | ||
| 474 | try { | 477 | try { |
| 475 | const result = await getCustomerSpecificQualityRequirements({ | 478 | const result = await getCustomerSpecificQualityRequirements({ |
| 476 | customerId: this.form.buyer, | 479 | customerId: this.form.buyer, |
| 477 | productIdList:id, | 480 | productIdList:id, |
| 478 | }); | 481 | }); |
| 482 | + if (seq !== this.qualityReqSeq) return | ||
| 479 | this.updateFormData(result.data || {}); | 483 | this.updateFormData(result.data || {}); |
| 480 | } catch (error) { | 484 | } catch (error) { |
| 485 | + if (seq !== this.qualityReqSeq) return | ||
| 481 | console.error('获取客户质量要求失败:', error); | 486 | console.error('获取客户质量要求失败:', error); |
| 482 | // 可以根据需要添加错误提示逻辑 | 487 | // 可以根据需要添加错误提示逻辑 |
| 483 | this.$message.error('获取历史数据失败,请稍后重试'); | 488 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -495,7 +500,7 @@ export default { | @@ -495,7 +500,7 @@ export default { | ||
| 495 | 'tolerance', | 500 | 'tolerance', |
| 496 | ]; | 501 | ]; |
| 497 | fields.forEach((field) => { | 502 | fields.forEach((field) => { |
| 498 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 503 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 499 | }); | 504 | }); |
| 500 | }, | 505 | }, |
| 501 | onProductsChange(products) { | 506 | onProductsChange(products) { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.rawProductName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.rawProductName || '请选择原材料名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.rawProductName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.rawProductName || '请选择原材料名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -184,7 +184,7 @@ | @@ -184,7 +184,7 @@ | ||
| 184 | </view> | 184 | </view> |
| 185 | 185 | ||
| 186 | <view v-else class="view-list" v-show="!collapsedView"> | 186 | <view v-else class="view-list" v-show="!collapsedView"> |
| 187 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 187 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 188 | <view class="row"><text class="label">原材料名称</text><text class="value">{{ item.rawProductName }}</text></view> | 188 | <view class="row"><text class="label">原材料名称</text><text class="value">{{ item.rawProductName }}</text></view> |
| 189 | <view class="row"><text class="label">原材料牌号</text><text class="value">{{ item.rawProductGradeName }}</text></view> | 189 | <view class="row"><text class="label">原材料牌号</text><text class="value">{{ item.rawProductGradeName }}</text></view> |
| 190 | <view class="row"><text class="label">原材料提供时间</text><text class="value">{{ item.supplyTime }}</text></view> | 190 | <view class="row"><text class="label">原材料提供时间</text><text class="value">{{ item.supplyTime }}</text></view> |
| @@ -302,19 +302,21 @@ export default { | @@ -302,19 +302,21 @@ export default { | ||
| 302 | }, | 302 | }, |
| 303 | list: { | 303 | list: { |
| 304 | handler(v) { | 304 | handler(v) { |
| 305 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 306 | - console.log('v', v) | 305 | + const arr = Array.isArray(v) ? v : [] |
| 306 | + this.items = arr.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 307 | }, | 307 | }, |
| 308 | deep: true | 308 | deep: true |
| 309 | } | 309 | } |
| 310 | }, | 310 | }, |
| 311 | created() { | 311 | created() { |
| 312 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 312 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 313 | this.items = init | 313 | this.items = init |
| 314 | - console.log('init', init) | ||
| 315 | this.recalculateAll() | 314 | this.recalculateAll() |
| 316 | }, | 315 | }, |
| 317 | methods: { | 316 | methods: { |
| 317 | + newKey() { | ||
| 318 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 319 | + }, | ||
| 318 | defaultItem() { | 320 | defaultItem() { |
| 319 | return { rawProductId: '', rawProductName: '', rawProductGradeId: '', rawProductGradeName: '', industry: '', quality: '', supplyTime: '', materialProductRatio: '', materialProductRatioName: '', materialProductRatioRemarks: '', productName: '', productId: '', productGrade: '', productStatus: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode:'', productQuantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } | 321 | return { rawProductId: '', rawProductName: '', rawProductGradeId: '', rawProductGradeName: '', industry: '', quality: '', supplyTime: '', materialProductRatio: '', materialProductRatioName: '', materialProductRatioRemarks: '', productName: '', productId: '', productGrade: '', productStatus: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode:'', productQuantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 320 | }, | 322 | }, |
| @@ -517,8 +519,9 @@ export default { | @@ -517,8 +519,9 @@ export default { | ||
| 517 | onAdd() { | 519 | onAdd() { |
| 518 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 520 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 519 | const obj = this.defaultItem() | 521 | const obj = this.defaultItem() |
| 522 | + obj._key = this.newKey() | ||
| 520 | obj.collapsed = true | 523 | obj.collapsed = true |
| 521 | - this.items.push(obj) | 524 | + this.items.unshift(obj) |
| 522 | this.emitChange() | 525 | this.emitChange() |
| 523 | }, | 526 | }, |
| 524 | onRemove(idx) { | 527 | onRemove(idx) { |
| @@ -292,6 +292,7 @@ export default { | @@ -292,6 +292,7 @@ export default { | ||
| 292 | customerRemarks: [], | 292 | customerRemarks: [], |
| 293 | defaultRemark: '', | 293 | defaultRemark: '', |
| 294 | regionOptions: [], | 294 | regionOptions: [], |
| 295 | + qualityReqSeq: 0, | ||
| 295 | } | 296 | } |
| 296 | }, | 297 | }, |
| 297 | onLoad(query) { | 298 | onLoad(query) { |
| @@ -465,13 +466,17 @@ export default { | @@ -465,13 +466,17 @@ export default { | ||
| 465 | if (!this.form.buyer || !id) { | 466 | if (!this.form.buyer || !id) { |
| 466 | return; | 467 | return; |
| 467 | } | 468 | } |
| 469 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 470 | + const seq = this.qualityReqSeq | ||
| 468 | try { | 471 | try { |
| 469 | const result = await getCustomerSpecificQualityRequirements({ | 472 | const result = await getCustomerSpecificQualityRequirements({ |
| 470 | customerId: this.form.buyer, | 473 | customerId: this.form.buyer, |
| 471 | productIdList:id, | 474 | productIdList:id, |
| 472 | }); | 475 | }); |
| 476 | + if (seq !== this.qualityReqSeq) return | ||
| 473 | this.updateFormData(result.data || {}); | 477 | this.updateFormData(result.data || {}); |
| 474 | } catch (error) { | 478 | } catch (error) { |
| 479 | + if (seq !== this.qualityReqSeq) return | ||
| 475 | console.error('获取客户质量要求失败:', error); | 480 | console.error('获取客户质量要求失败:', error); |
| 476 | // 可以根据需要添加错误提示逻辑 | 481 | // 可以根据需要添加错误提示逻辑 |
| 477 | this.$message.error('获取历史数据失败,请稍后重试'); | 482 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -489,7 +494,7 @@ export default { | @@ -489,7 +494,7 @@ export default { | ||
| 489 | 'tolerance', | 494 | 'tolerance', |
| 490 | ]; | 495 | ]; |
| 491 | fields.forEach((field) => { | 496 | fields.forEach((field) => { |
| 492 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 497 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 493 | }); | 498 | }); |
| 494 | }, | 499 | }, |
| 495 | onProductsChange(products) { | 500 | onProductsChange(products) { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -157,7 +157,7 @@ | @@ -157,7 +157,7 @@ | ||
| 157 | </view> | 157 | </view> |
| 158 | 158 | ||
| 159 | <view v-else class="view-list" v-show="!collapsedView"> | 159 | <view v-else class="view-list" v-show="!collapsedView"> |
| 160 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 160 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 161 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> | 161 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> |
| 162 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> | 162 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> |
| 163 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> | 163 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> |
| @@ -260,17 +260,20 @@ export default { | @@ -260,17 +260,20 @@ export default { | ||
| 260 | if (!v || !v.length) return | 260 | if (!v || !v.length) return |
| 261 | // Only update if significantly different to avoid loop/reset | 261 | // Only update if significantly different to avoid loop/reset |
| 262 | // For now, assuming external update wants to reset | 262 | // For now, assuming external update wants to reset |
| 263 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | 263 | + this.items = v.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) |
| 264 | }, | 264 | }, |
| 265 | deep: true | 265 | deep: true |
| 266 | } | 266 | } |
| 267 | }, | 267 | }, |
| 268 | created() { | 268 | created() { |
| 269 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 269 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 270 | this.items = init | 270 | this.items = init |
| 271 | this.recalculateAll() | 271 | this.recalculateAll() |
| 272 | }, | 272 | }, |
| 273 | methods: { | 273 | methods: { |
| 274 | + newKey() { | ||
| 275 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 276 | + }, | ||
| 274 | defaultItem() { | 277 | defaultItem() { |
| 275 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } | 278 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 276 | }, | 279 | }, |
| @@ -433,8 +436,9 @@ export default { | @@ -433,8 +436,9 @@ export default { | ||
| 433 | onAdd() { | 436 | onAdd() { |
| 434 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 437 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 435 | const obj = this.defaultItem() | 438 | const obj = this.defaultItem() |
| 439 | + obj._key = this.newKey() | ||
| 436 | obj.collapsed = true | 440 | obj.collapsed = true |
| 437 | - this.items.push(obj) | 441 | + this.items.unshift(obj) |
| 438 | this.emitChange() | 442 | this.emitChange() |
| 439 | }, | 443 | }, |
| 440 | onRemove(idx) { | 444 | onRemove(idx) { |
| @@ -290,6 +290,7 @@ export default { | @@ -290,6 +290,7 @@ export default { | ||
| 290 | customerRemarks: [], | 290 | customerRemarks: [], |
| 291 | defaultRemark: '', | 291 | defaultRemark: '', |
| 292 | regionOptions: [], | 292 | regionOptions: [], |
| 293 | + qualityReqSeq: 0, | ||
| 293 | } | 294 | } |
| 294 | }, | 295 | }, |
| 295 | onLoad(query) { | 296 | onLoad(query) { |
| @@ -462,13 +463,17 @@ export default { | @@ -462,13 +463,17 @@ export default { | ||
| 462 | if (!this.form.buyer || !id) { | 463 | if (!this.form.buyer || !id) { |
| 463 | return; | 464 | return; |
| 464 | } | 465 | } |
| 466 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 467 | + const seq = this.qualityReqSeq | ||
| 465 | try { | 468 | try { |
| 466 | const result = await getCustomerSpecificQualityRequirements({ | 469 | const result = await getCustomerSpecificQualityRequirements({ |
| 467 | customerId: this.form.buyer, | 470 | customerId: this.form.buyer, |
| 468 | productIdList:id, | 471 | productIdList:id, |
| 469 | }); | 472 | }); |
| 473 | + if (seq !== this.qualityReqSeq) return | ||
| 470 | this.updateFormData(result.data || {}); | 474 | this.updateFormData(result.data || {}); |
| 471 | } catch (error) { | 475 | } catch (error) { |
| 476 | + if (seq !== this.qualityReqSeq) return | ||
| 472 | console.error('获取客户质量要求失败:', error); | 477 | console.error('获取客户质量要求失败:', error); |
| 473 | // 可以根据需要添加错误提示逻辑 | 478 | // 可以根据需要添加错误提示逻辑 |
| 474 | this.$message.error('获取历史数据失败,请稍后重试'); | 479 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -486,7 +491,7 @@ export default { | @@ -486,7 +491,7 @@ export default { | ||
| 486 | 'tolerance', | 491 | 'tolerance', |
| 487 | ]; | 492 | ]; |
| 488 | fields.forEach((field) => { | 493 | fields.forEach((field) => { |
| 489 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 494 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 490 | }); | 495 | }); |
| 491 | }, | 496 | }, |
| 492 | onProductsChange(products) { | 497 | onProductsChange(products) { |
| @@ -292,6 +292,7 @@ export default { | @@ -292,6 +292,7 @@ export default { | ||
| 292 | customerRemarks: [], | 292 | customerRemarks: [], |
| 293 | defaultRemark: '', | 293 | defaultRemark: '', |
| 294 | regionOptions: [], | 294 | regionOptions: [], |
| 295 | + qualityReqSeq: 0, | ||
| 295 | } | 296 | } |
| 296 | }, | 297 | }, |
| 297 | onLoad(query) { | 298 | onLoad(query) { |
| @@ -466,13 +467,17 @@ export default { | @@ -466,13 +467,17 @@ export default { | ||
| 466 | if (!this.form.buyer || !id) { | 467 | if (!this.form.buyer || !id) { |
| 467 | return; | 468 | return; |
| 468 | } | 469 | } |
| 470 | + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1 | ||
| 471 | + const seq = this.qualityReqSeq | ||
| 469 | try { | 472 | try { |
| 470 | const result = await getCustomerSpecificQualityRequirements({ | 473 | const result = await getCustomerSpecificQualityRequirements({ |
| 471 | customerId: this.form.buyer, | 474 | customerId: this.form.buyer, |
| 472 | productIdList:id, | 475 | productIdList:id, |
| 473 | }); | 476 | }); |
| 477 | + if (seq !== this.qualityReqSeq) return | ||
| 474 | this.updateFormData(result.data || {}); | 478 | this.updateFormData(result.data || {}); |
| 475 | } catch (error) { | 479 | } catch (error) { |
| 480 | + if (seq !== this.qualityReqSeq) return | ||
| 476 | console.error('获取客户质量要求失败:', error); | 481 | console.error('获取客户质量要求失败:', error); |
| 477 | // 可以根据需要添加错误提示逻辑 | 482 | // 可以根据需要添加错误提示逻辑 |
| 478 | this.$message.error('获取历史数据失败,请稍后重试'); | 483 | this.$message.error('获取历史数据失败,请稍后重试'); |
| @@ -490,7 +495,7 @@ export default { | @@ -490,7 +495,7 @@ export default { | ||
| 490 | 'tolerance', | 495 | 'tolerance', |
| 491 | ]; | 496 | ]; |
| 492 | fields.forEach((field) => { | 497 | fields.forEach((field) => { |
| 493 | - this.form[field] = (this.form[field] || '') + (result[field] || ''); | 498 | + this.form[field] = result[field] != null ? String(result[field]) : '' |
| 494 | }); | 499 | }); |
| 495 | }, | 500 | }, |
| 496 | onProductsChange(products) { | 501 | onProductsChange(products) { |
| @@ -2,6 +2,43 @@ | @@ -2,6 +2,43 @@ | ||
| 2 | <view class="page"> | 2 | <view class="page"> |
| 3 | <scroll-view class="scroll" scroll-y> | 3 | <scroll-view class="scroll" scroll-y> |
| 4 | <view class="lock-page"> | 4 | <view class="lock-page"> |
| 5 | + <view class="block"> | ||
| 6 | + <view class="block-header"> | ||
| 7 | + <text class="block-title">具体质量要求</text> | ||
| 8 | + </view> | ||
| 9 | + <uni-list> | ||
| 10 | + <uni-list-item title="件重条头"> | ||
| 11 | + <template v-slot:footer> | ||
| 12 | + <uni-easyinput v-model="qualityForm.pieceWeightHead" placeholder="请输入" /> | ||
| 13 | + </template> | ||
| 14 | + </uni-list-item> | ||
| 15 | + <uni-list-item title="表面"> | ||
| 16 | + <template v-slot:footer> | ||
| 17 | + <uni-easyinput v-model="qualityForm.surface" placeholder="请输入" /> | ||
| 18 | + </template> | ||
| 19 | + </uni-list-item> | ||
| 20 | + <uni-list-item title="公差"> | ||
| 21 | + <template v-slot:footer> | ||
| 22 | + <uni-easyinput v-model="qualityForm.tolerance" placeholder="请输入" /> | ||
| 23 | + </template> | ||
| 24 | + </uni-list-item> | ||
| 25 | + <uni-list-item title="性能"> | ||
| 26 | + <template v-slot:footer> | ||
| 27 | + <uni-easyinput v-model="qualityForm.performance" placeholder="请输入" /> | ||
| 28 | + </template> | ||
| 29 | + </uni-list-item> | ||
| 30 | + <uni-list-item title="成分"> | ||
| 31 | + <template v-slot:footer> | ||
| 32 | + <uni-easyinput v-model="qualityForm.component" placeholder="请输入" /> | ||
| 33 | + </template> | ||
| 34 | + </uni-list-item> | ||
| 35 | + <uni-list-item title="包装"> | ||
| 36 | + <template v-slot:footer> | ||
| 37 | + <uni-easyinput v-model="qualityForm.packaging" placeholder="请输入" /> | ||
| 38 | + </template> | ||
| 39 | + </uni-list-item> | ||
| 40 | + </uni-list> | ||
| 41 | + </view> | ||
| 5 | <view class="block" v-for="(item, idx) in items" :key="item.raw && (item.raw.id || item.raw.lineId || item.raw.productId) || ('row-' + idx)"> | 42 | <view class="block" v-for="(item, idx) in items" :key="item.raw && (item.raw.id || item.raw.lineId || item.raw.productId) || ('row-' + idx)"> |
| 6 | <view class="block-header"> | 43 | <view class="block-header"> |
| 7 | <uni-data-checkbox | 44 | <uni-data-checkbox |
| @@ -193,6 +230,14 @@ export default { | @@ -193,6 +230,14 @@ export default { | ||
| 193 | planQty: 30, | 230 | planQty: 30, |
| 194 | sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' }, | 231 | sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' }, |
| 195 | options: [], | 232 | options: [], |
| 233 | + qualityForm: { | ||
| 234 | + pieceWeightHead: '', | ||
| 235 | + surface: '', | ||
| 236 | + tolerance: '', | ||
| 237 | + performance: '', | ||
| 238 | + component: '', | ||
| 239 | + packaging: '' | ||
| 240 | + } | ||
| 196 | } | 241 | } |
| 197 | }, | 242 | }, |
| 198 | computed: { | 243 | computed: { |
| @@ -296,6 +341,14 @@ export default { | @@ -296,6 +341,14 @@ export default { | ||
| 296 | try { | 341 | try { |
| 297 | const res = await getContractApi(this.id) | 342 | const res = await getContractApi(this.id) |
| 298 | const data = res && res.data ? res.data : {} | 343 | const data = res && res.data ? res.data : {} |
| 344 | + this.qualityForm = { | ||
| 345 | + pieceWeightHead: data.pieceWeightHead || '', | ||
| 346 | + surface: data.surface || '', | ||
| 347 | + tolerance: data.tolerance || '', | ||
| 348 | + performance: data.performance || '', | ||
| 349 | + component: data.component || '', | ||
| 350 | + packaging: data.packaging || '' | ||
| 351 | + } | ||
| 299 | const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : [] | 352 | const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : [] |
| 300 | const init = lines.map(v => ({ | 353 | const init = lines.map(v => ({ |
| 301 | locked: false, | 354 | locked: false, |
| @@ -481,6 +534,12 @@ export default { | @@ -481,6 +534,12 @@ export default { | ||
| 481 | totalAmountIncludingTax: this.totalAmountIncludingTax, | 534 | totalAmountIncludingTax: this.totalAmountIncludingTax, |
| 482 | totalQuantity: this.totalQuantity, | 535 | totalQuantity: this.totalQuantity, |
| 483 | type:'DRAFT_DIST_AGMT', | 536 | type:'DRAFT_DIST_AGMT', |
| 537 | + pieceWeightHead: this.qualityForm.pieceWeightHead, | ||
| 538 | + surface: this.qualityForm.surface, | ||
| 539 | + tolerance: this.qualityForm.tolerance, | ||
| 540 | + performance: this.qualityForm.performance, | ||
| 541 | + component: this.qualityForm.component, | ||
| 542 | + packaging: this.qualityForm.packaging, | ||
| 484 | contractDistributorLineList: selected | 543 | contractDistributorLineList: selected |
| 485 | } | 544 | } |
| 486 | 545 | ||
| @@ -563,6 +622,9 @@ export default { | @@ -563,6 +622,9 @@ export default { | ||
| 563 | margin-left: 12rpx; | 622 | margin-left: 12rpx; |
| 564 | font-size: 28rpx; | 623 | font-size: 28rpx; |
| 565 | color: rgba(0, 0, 0, 0.9); | 624 | color: rgba(0, 0, 0, 0.9); |
| 625 | + font-weight: 600; | ||
| 626 | + font-size: 20px; | ||
| 627 | + color: rgba(0, 0, 0, 0.9); | ||
| 566 | } | 628 | } |
| 567 | 629 | ||
| 568 | .ops { | 630 | .ops { |
| @@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
| 14 | </view> | 14 | </view> |
| 15 | 15 | ||
| 16 | <view v-if="mode === 'add'" class="add-list"> | 16 | <view v-if="mode === 'add'" class="add-list"> |
| 17 | - <view v-for="(item, idx) in items" :key="idx" class="block"> | 17 | + <view v-for="(item, idx) in items" :key="item._key || idx" class="block"> |
| 18 | <uni-list v-show="item.collapsed"> | 18 | <uni-list v-show="item.collapsed"> |
| 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> | 19 | <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow> |
| 20 | <template v-slot:body> | 20 | <template v-slot:body> |
| @@ -157,7 +157,7 @@ | @@ -157,7 +157,7 @@ | ||
| 157 | </view> | 157 | </view> |
| 158 | 158 | ||
| 159 | <view v-else class="view-list" v-show="!collapsedView"> | 159 | <view v-else class="view-list" v-show="!collapsedView"> |
| 160 | - <view v-for="(item, idx) in items" :key="'v-' + idx" class="card"> | 160 | + <view v-for="(item, idx) in items" :key="'v-' + (item._key || idx)" class="card"> |
| 161 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> | 161 | <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view> |
| 162 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> | 162 | <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view> |
| 163 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> | 163 | <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view> |
| @@ -257,20 +257,21 @@ export default { | @@ -257,20 +257,21 @@ export default { | ||
| 257 | }, | 257 | }, |
| 258 | list: { | 258 | list: { |
| 259 | handler(v) { | 259 | handler(v) { |
| 260 | - // const arr = Array.isArray(v) ? v : [] | ||
| 261 | - // this.items = arr.map(x => ({ ...this.defaultItem(), ...x, collapsed: true })) | ||
| 262 | - this.items = v.map(x => ({ ...this.defaultItem(), ...x, sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 263 | - console.log('v', v) | 260 | + const arr = Array.isArray(v) ? v : [] |
| 261 | + this.items = arr.map(x => ({ ...this.defaultItem(), ...x, _key: x && x._key ? x._key : this.newKey(), sampleOrder: !!x.sampleOrder, collapsed: true })) | ||
| 264 | }, | 262 | }, |
| 265 | deep: true | 263 | deep: true |
| 266 | } | 264 | } |
| 267 | }, | 265 | }, |
| 268 | created() { | 266 | created() { |
| 269 | - const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), collapsed: false }] | 267 | + const init = Array.isArray(this.list) && this.list.length > 0 ? this.list.map(v => ({ ...this.defaultItem(), ...v, _key: v && v._key ? v._key : this.newKey(), sampleOrder: !!v.sampleOrder, collapsed: true })) : [{ ...this.defaultItem(), _key: this.newKey(), collapsed: false }] |
| 270 | this.items = init | 268 | this.items = init |
| 271 | this.recalculateAll() | 269 | this.recalculateAll() |
| 272 | }, | 270 | }, |
| 273 | methods: { | 271 | methods: { |
| 272 | + newKey() { | ||
| 273 | + return `${Date.now()}-${Math.random().toString(16).slice(2)}` | ||
| 274 | + }, | ||
| 274 | defaultItem() { | 275 | defaultItem() { |
| 275 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } | 276 | return { productId: '', productName: '', industry: '', brand: '', quality: '', thickness: '', thicknessTolPos: '', thicknessTolNeg: '', width: '', widthTolPos: '', widthTolNeg: '', length: '', lengthTolPos: '', lengthTolNeg: '', materialCode: '', status: '', quantity: '', unitPrice: '', amountExcludingTax: 0, totalAmount: 0, deliveryDate: '', sampleOrder: false } |
| 276 | }, | 277 | }, |
| @@ -424,8 +425,9 @@ export default { | @@ -424,8 +425,9 @@ export default { | ||
| 424 | onAdd() { | 425 | onAdd() { |
| 425 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) | 426 | if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' }) |
| 426 | const obj = this.defaultItem() | 427 | const obj = this.defaultItem() |
| 428 | + obj._key = this.newKey() | ||
| 427 | obj.collapsed = true | 429 | obj.collapsed = true |
| 428 | - this.items.push(obj) | 430 | + this.items.unshift(obj) |
| 429 | this.emitChange() | 431 | this.emitChange() |
| 430 | }, | 432 | }, |
| 431 | onRemove(idx) { | 433 | onRemove(idx) { |