Commit 15832c3d57db1f8569161164391a31a6ed516a01

Authored by gesilong
2 parents f84c5b27 9748025d

Merge branch 'cjerp-contract-1.0' into test_cjerp

@@ -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) {
@@ -5,6 +5,8 @@ @@ -5,6 +5,8 @@
5 <view class="section"> 5 <view class="section">
6 <text class="row company">{{ form.orderNo }}</text> 6 <text class="row company">{{ form.orderNo }}</text>
7 <view :class="['status', `status_${form.status}`]" /> 7 <view :class="['status', `status_${form.status}`]" />
  8 + <view class="row"><text class="label">合同类型</text><text class="value">{{ getDicName('CONTRACT_TYPE',form.contractType, dicOptions.CONTRACT_TYPE) }}</text></view>
  9 +
8 <view class="row"> 10 <view class="row">
9 <text class="label">审核状态</text> 11 <text class="label">审核状态</text>
10 <text class="value" :class="['status2', `status2_${form.examineStatus}`]"> 12 <text class="value" :class="['status2', `status2_${form.examineStatus}`]">
@@ -121,6 +123,7 @@ export default { @@ -121,6 +123,7 @@ export default {
121 AUDIT_STATUS: [], 123 AUDIT_STATUS: [],
122 SUPPLIER: [], 124 SUPPLIER: [],
123 APPLICABLE_STANDARD: [], 125 APPLICABLE_STANDARD: [],
  126 + CONTRACT_TYPE: [],
124 }, 127 },
125 } 128 }
126 }, 129 },
@@ -267,16 +270,18 @@ export default { @@ -267,16 +270,18 @@ export default {
267 }, 270 },
268 271
269 loadAllDicData() { 272 loadAllDicData() {
270 - const dicCodes = ['AUDIT_STATUS', 'SUPPLIER', 'APPLICABLE_STANDARD'] 273 + const dicCodes = ['AUDIT_STATUS', 'SUPPLIER', 'APPLICABLE_STANDARD', 'CONTRACT_TYPE']
271 return getDicByCodes(dicCodes).then(results => { 274 return getDicByCodes(dicCodes).then(results => {
272 this.dicOptions.AUDIT_STATUS = results.AUDIT_STATUS.data || [] 275 this.dicOptions.AUDIT_STATUS = results.AUDIT_STATUS.data || []
273 this.dicOptions.SUPPLIER = results.SUPPLIER.data || [] 276 this.dicOptions.SUPPLIER = results.SUPPLIER.data || []
274 this.dicOptions.APPLICABLE_STANDARD = results.APPLICABLE_STANDARD.data || [] 277 this.dicOptions.APPLICABLE_STANDARD = results.APPLICABLE_STANDARD.data || []
  278 + this.dicOptions.CONTRACT_TYPE = results.CONTRACT_TYPE.data || []
275 }).catch(() => { 279 }).catch(() => {
276 this.dicOptions = { 280 this.dicOptions = {
277 AUDIT_STATUS: [], 281 AUDIT_STATUS: [],
278 SUPPLIER: [], 282 SUPPLIER: [],
279 APPLICABLE_STANDARD: [], 283 APPLICABLE_STANDARD: [],
  284 + CONTRACT_TYPE: [],
280 } 285 }
281 }) 286 })
282 }, 287 },