Commit 706855b31911a6408e3f94161ca1740cc7e32a73

Authored by gesilong
1 parent 7eccee4a

commit:锁规时具体质量要求;合同关联历史记录问题不追加;新增顺序问题

... ... @@ -296,6 +296,7 @@ export default {
296 296 customerRemarks: [],
297 297 defaultRemark: '',
298 298 regionOptions: [],
  299 + qualityReqSeq: 0,
299 300 }
300 301 },
301 302 onLoad(query) {
... ... @@ -468,13 +469,17 @@ export default {
468 469 if (!this.form.buyer || !id) {
469 470 return;
470 471 }
  472 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  473 + const seq = this.qualityReqSeq
471 474 try {
472 475 const result = await getCustomerSpecificQualityRequirements({
473 476 customerId: this.form.buyer,
474 477 productIdList:id,
475 478 });
  479 + if (seq !== this.qualityReqSeq) return
476 480 this.updateFormData(result.data || {});
477 481 } catch (error) {
  482 + if (seq !== this.qualityReqSeq) return
478 483 console.error('获取客户质量要求失败:', error);
479 484 // 可以根据需要添加错误提示逻辑
480 485 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -491,7 +496,7 @@ export default {
491 496 'tolerance',
492 497 ];
493 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 502 onProductsChange(products) {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -162,7 +162,7 @@
162 162 </view>
163 163
164 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 166 <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view>
167 167 <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>
168 168 <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>
... ... @@ -262,20 +262,22 @@ export default {
262 262 },
263 263 list: {
264 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 267 console.log('v', v)
269 268 },
270 269 deep: true
271 270 }
272 271 },
273 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 274 this.items = init
276 275 this.recalculateAll()
277 276 },
278 277 methods: {
  278 + newKey() {
  279 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  280 + },
279 281 defaultItem() {
280 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 441 onAdd() {
440 442 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
441 443 const obj = this.defaultItem()
  444 + obj._key = this.newKey()
442 445 obj.collapsed = true
443   - this.items.push(obj)
  446 + this.items.unshift(obj)
444 447 this.emitChange()
445 448 },
446 449 onRemove(idx) {
... ...
... ... @@ -298,6 +298,7 @@ export default {
298 298 customerRemarks: [],
299 299 defaultRemark: '',
300 300 regionOptions: [],
  301 + qualityReqSeq: 0,
301 302 }
302 303 },
303 304 onLoad(query) {
... ... @@ -470,13 +471,17 @@ export default {
470 471 if (!this.form.buyer || !id) {
471 472 return;
472 473 }
  474 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  475 + const seq = this.qualityReqSeq
473 476 try {
474 477 const result = await getCustomerSpecificQualityRequirements({
475 478 customerId: this.form.buyer,
476 479 productIdList:id,
477 480 });
  481 + if (seq !== this.qualityReqSeq) return
478 482 this.updateFormData(result.data || {});
479 483 } catch (error) {
  484 + if (seq !== this.qualityReqSeq) return
480 485 console.error('获取客户质量要求失败:', error);
481 486 // 可以根据需要添加错误提示逻辑
482 487 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -494,7 +499,7 @@ export default {
494 499 'tolerance',
495 500 ];
496 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 505 onProductsChange(products) {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -164,7 +164,7 @@
164 164 </view>
165 165
166 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 168 <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view>
169 169 <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>
170 170 <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>
... ... @@ -242,16 +242,14 @@ export default {
242 242 },
243 243 list: {
244 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 248 deep: true
251 249 }
252 250 },
253 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 253 this.items = init
256 254 this.recalculateAll()
257 255 },
... ... @@ -278,6 +276,9 @@ export default {
278 276 }
279 277 },
280 278 methods: {
  279 + newKey() {
  280 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  281 + },
281 282 defaultItem() {
282 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 410 onAdd() {
410 411 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
411 412 const obj = this.defaultItem()
  413 + obj._key = this.newKey()
412 414 obj.collapsed = true
413   - this.items.push(obj)
  415 + this.items.unshift(obj)
414 416 this.emitChange()
415 417 },
416 418 onRemove(idx) {
... ...
... ... @@ -296,6 +296,7 @@ export default {
296 296 customerRemarks: [],
297 297 defaultRemark: '',
298 298 regionOptions: [],
  299 + qualityReqSeq: 0,
299 300 }
300 301 },
301 302 onLoad(query) {
... ... @@ -468,13 +469,17 @@ export default {
468 469 if (!this.form.buyer || !id) {
469 470 return;
470 471 }
  472 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  473 + const seq = this.qualityReqSeq
471 474 try {
472 475 const result = await getCustomerSpecificQualityRequirements({
473 476 customerId: this.form.buyer,
474 477 productIdList:id,
475 478 });
  479 + if (seq !== this.qualityReqSeq) return
476 480 this.updateFormData(result.data || {});
477 481 } catch (error) {
  482 + if (seq !== this.qualityReqSeq) return
478 483 console.error('获取客户质量要求失败:', error);
479 484 // 可以根据需要添加错误提示逻辑
480 485 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -492,7 +497,7 @@ export default {
492 497 'tolerance',
493 498 ];
494 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 503 onProductsChange(products) {
... ...
... ... @@ -2,6 +2,43 @@
2 2 <view class="page">
3 3 <scroll-view class="scroll" scroll-y>
4 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 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 43 <view class="block-header">
7 44 <uni-data-checkbox multiple mode="default" :localdata="[{ text: '锁规', value: 'LOCKED' }]"
... ... @@ -193,6 +230,14 @@ export default {
193 230 planQty: 30,
194 231 sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' },
195 232 options: [],
  233 + qualityForm: {
  234 + pieceWeightHead: '',
  235 + surface: '',
  236 + tolerance: '',
  237 + performance: '',
  238 + component: '',
  239 + packaging: ''
  240 + }
196 241 }
197 242 },
198 243 computed: {
... ... @@ -280,6 +325,14 @@ export default {
280 325 try {
281 326 const res = await getContractApi(this.id)
282 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 336 const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : []
284 337 const init = lines.map(v => ({
285 338 locked: false,
... ... @@ -465,6 +518,12 @@ export default {
465 518 totalAmountIncludingTax: this.totalAmountIncludingTax,
466 519 totalQuantity: this.totalQuantity,
467 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 527 contractDistributorLineList: selected
469 528 }
470 529
... ... @@ -548,6 +607,9 @@ export default {
548 607 margin-left: 12rpx;
549 608 font-size: 28rpx;
550 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 615 .ops {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -162,7 +162,7 @@
162 162 </view>
163 163
164 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 166 <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view>
167 167 <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>
168 168 <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>
... ... @@ -258,20 +258,21 @@ export default {
258 258 },
259 259 list: {
260 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 264 deep: true
267 265 }
268 266 },
269 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 269 this.items = init
272 270 this.recalculateAll()
273 271 },
274 272 methods: {
  273 + newKey() {
  274 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  275 + },
275 276 defaultItem() {
276 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 447 onAdd() {
447 448 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
448 449 const obj = this.defaultItem()
  450 + obj._key = this.newKey()
449 451 obj.collapsed = true
450   - this.items.push(obj)
  452 + this.items.unshift(obj)
451 453 this.emitChange()
452 454 },
453 455 onRemove(idx) {
... ...
... ... @@ -299,6 +299,7 @@ export default {
299 299 rawToProdRatioList: [],
300 300 rawProductList: [],
301 301 rawProductGradeList: [],
  302 + qualityReqSeq: 0,
302 303 }
303 304 },
304 305 onLoad(query) {
... ... @@ -471,13 +472,17 @@ export default {
471 472 if (!this.form.buyer || !id) {
472 473 return;
473 474 }
  475 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  476 + const seq = this.qualityReqSeq
474 477 try {
475 478 const result = await getCustomerSpecificQualityRequirements({
476 479 customerId: this.form.buyer,
477 480 productIdList:id,
478 481 });
  482 + if (seq !== this.qualityReqSeq) return
479 483 this.updateFormData(result.data || {});
480 484 } catch (error) {
  485 + if (seq !== this.qualityReqSeq) return
481 486 console.error('获取客户质量要求失败:', error);
482 487 // 可以根据需要添加错误提示逻辑
483 488 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -495,7 +500,7 @@ export default {
495 500 'tolerance',
496 501 ];
497 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 506 onProductsChange(products) {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.rawProductName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.rawProductName || '请选择原材料名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -184,7 +184,7 @@
184 184 </view>
185 185
186 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 188 <view class="row"><text class="label">原材料名称</text><text class="value">{{ item.rawProductName }}</text></view>
189 189 <view class="row"><text class="label">原材料牌号</text><text class="value">{{ item.rawProductGradeName }}</text></view>
190 190 <view class="row"><text class="label">原材料提供时间</text><text class="value">{{ item.supplyTime }}</text></view>
... ... @@ -302,19 +302,21 @@ export default {
302 302 },
303 303 list: {
304 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 308 deep: true
309 309 }
310 310 },
311 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 313 this.items = init
314   - console.log('init', init)
315 314 this.recalculateAll()
316 315 },
317 316 methods: {
  317 + newKey() {
  318 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  319 + },
318 320 defaultItem() {
319 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 519 onAdd() {
518 520 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
519 521 const obj = this.defaultItem()
  522 + obj._key = this.newKey()
520 523 obj.collapsed = true
521   - this.items.push(obj)
  524 + this.items.unshift(obj)
522 525 this.emitChange()
523 526 },
524 527 onRemove(idx) {
... ...
... ... @@ -292,6 +292,7 @@ export default {
292 292 customerRemarks: [],
293 293 defaultRemark: '',
294 294 regionOptions: [],
  295 + qualityReqSeq: 0,
295 296 }
296 297 },
297 298 onLoad(query) {
... ... @@ -465,13 +466,17 @@ export default {
465 466 if (!this.form.buyer || !id) {
466 467 return;
467 468 }
  469 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  470 + const seq = this.qualityReqSeq
468 471 try {
469 472 const result = await getCustomerSpecificQualityRequirements({
470 473 customerId: this.form.buyer,
471 474 productIdList:id,
472 475 });
  476 + if (seq !== this.qualityReqSeq) return
473 477 this.updateFormData(result.data || {});
474 478 } catch (error) {
  479 + if (seq !== this.qualityReqSeq) return
475 480 console.error('获取客户质量要求失败:', error);
476 481 // 可以根据需要添加错误提示逻辑
477 482 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -489,7 +494,7 @@ export default {
489 494 'tolerance',
490 495 ];
491 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 500 onProductsChange(products) {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -157,7 +157,7 @@
157 157 </view>
158 158
159 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 161 <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view>
162 162 <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>
163 163 <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>
... ... @@ -260,17 +260,20 @@ export default {
260 260 if (!v || !v.length) return
261 261 // Only update if significantly different to avoid loop/reset
262 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 265 deep: true
266 266 }
267 267 },
268 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 270 this.items = init
271 271 this.recalculateAll()
272 272 },
273 273 methods: {
  274 + newKey() {
  275 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  276 + },
274 277 defaultItem() {
275 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 436 onAdd() {
434 437 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
435 438 const obj = this.defaultItem()
  439 + obj._key = this.newKey()
436 440 obj.collapsed = true
437   - this.items.push(obj)
  441 + this.items.unshift(obj)
438 442 this.emitChange()
439 443 },
440 444 onRemove(idx) {
... ...
... ... @@ -290,6 +290,7 @@ export default {
290 290 customerRemarks: [],
291 291 defaultRemark: '',
292 292 regionOptions: [],
  293 + qualityReqSeq: 0,
293 294 }
294 295 },
295 296 onLoad(query) {
... ... @@ -462,13 +463,17 @@ export default {
462 463 if (!this.form.buyer || !id) {
463 464 return;
464 465 }
  466 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  467 + const seq = this.qualityReqSeq
465 468 try {
466 469 const result = await getCustomerSpecificQualityRequirements({
467 470 customerId: this.form.buyer,
468 471 productIdList:id,
469 472 });
  473 + if (seq !== this.qualityReqSeq) return
470 474 this.updateFormData(result.data || {});
471 475 } catch (error) {
  476 + if (seq !== this.qualityReqSeq) return
472 477 console.error('获取客户质量要求失败:', error);
473 478 // 可以根据需要添加错误提示逻辑
474 479 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -486,7 +491,7 @@ export default {
486 491 'tolerance',
487 492 ];
488 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 497 onProductsChange(products) {
... ...
... ... @@ -292,6 +292,7 @@ export default {
292 292 customerRemarks: [],
293 293 defaultRemark: '',
294 294 regionOptions: [],
  295 + qualityReqSeq: 0,
295 296 }
296 297 },
297 298 onLoad(query) {
... ... @@ -466,13 +467,17 @@ export default {
466 467 if (!this.form.buyer || !id) {
467 468 return;
468 469 }
  470 + this.qualityReqSeq = (Number(this.qualityReqSeq) || 0) + 1
  471 + const seq = this.qualityReqSeq
469 472 try {
470 473 const result = await getCustomerSpecificQualityRequirements({
471 474 customerId: this.form.buyer,
472 475 productIdList:id,
473 476 });
  477 + if (seq !== this.qualityReqSeq) return
474 478 this.updateFormData(result.data || {});
475 479 } catch (error) {
  480 + if (seq !== this.qualityReqSeq) return
476 481 console.error('获取客户质量要求失败:', error);
477 482 // 可以根据需要添加错误提示逻辑
478 483 this.$message.error('获取历史数据失败,请稍后重试');
... ... @@ -490,7 +495,7 @@ export default {
490 495 'tolerance',
491 496 ];
492 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 501 onProductsChange(products) {
... ...
... ... @@ -2,6 +2,43 @@
2 2 <view class="page">
3 3 <scroll-view class="scroll" scroll-y>
4 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 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 43 <view class="block-header">
7 44 <uni-data-checkbox
... ... @@ -193,6 +230,14 @@ export default {
193 230 planQty: 30,
194 231 sheet: { visible: false, title: '请选择', options: [], idx: -1, value: '', mode: '' },
195 232 options: [],
  233 + qualityForm: {
  234 + pieceWeightHead: '',
  235 + surface: '',
  236 + tolerance: '',
  237 + performance: '',
  238 + component: '',
  239 + packaging: ''
  240 + }
196 241 }
197 242 },
198 243 computed: {
... ... @@ -296,6 +341,14 @@ export default {
296 341 try {
297 342 const res = await getContractApi(this.id)
298 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 352 const lines = Array.isArray(data.contractDistributorLineList) ? data.contractDistributorLineList : []
300 353 const init = lines.map(v => ({
301 354 locked: false,
... ... @@ -481,6 +534,12 @@ export default {
481 534 totalAmountIncludingTax: this.totalAmountIncludingTax,
482 535 totalQuantity: this.totalQuantity,
483 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 543 contractDistributorLineList: selected
485 544 }
486 545
... ... @@ -563,6 +622,9 @@ export default {
563 622 margin-left: 12rpx;
564 623 font-size: 28rpx;
565 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 630 .ops {
... ...
... ... @@ -14,7 +14,7 @@
14 14 </view>
15 15
16 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 18 <uni-list v-show="item.collapsed">
19 19 <uni-list-item class="select-item" :class="item.productName ? 'is-filled' : 'is-empty'" clickable @click="openProductSheet(idx, 'product')" :rightText="item.productName || '请选择产品名称'" showArrow>
20 20 <template v-slot:body>
... ... @@ -157,7 +157,7 @@
157 157 </view>
158 158
159 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 161 <view class="row"><text class="label">产品名称</text><text class="value">{{ item.productName }}</text></view>
162 162 <view class="row"><text class="label">行业</text><text class="value">{{ item.industry }}</text></view>
163 163 <view class="row"><text class="label">牌号</text><text class="value">{{ item.brand }}</text></view>
... ... @@ -257,20 +257,21 @@ export default {
257 257 },
258 258 list: {
259 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 263 deep: true
266 264 }
267 265 },
268 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 268 this.items = init
271 269 this.recalculateAll()
272 270 },
273 271 methods: {
  272 + newKey() {
  273 + return `${Date.now()}-${Math.random().toString(16).slice(2)}`
  274 + },
274 275 defaultItem() {
275 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 425 onAdd() {
425 426 if (this.items.length >= this.max) return uni.showToast({ title: `最多添加${this.max}个`, icon: 'none' })
426 427 const obj = this.defaultItem()
  428 + obj._key = this.newKey()
427 429 obj.collapsed = true
428   - this.items.push(obj)
  430 + this.items.unshift(obj)
429 431 this.emitChange()
430 432 },
431 433 onRemove(idx) {
... ...