| | |
| | | |
| | | import { createVNode, render, h, reactive } from 'vue'; |
| | | import { ElDialog, ElForm, ElFormItem, ElSelect, ElOption, ElButton, ElMessage, ElLoading } from 'element-plus'; |
| | | let extension = { |
| | | components: { |
| | | //æ¥è¯¢ç颿©å±ç»ä»¶ |
| | |
| | | column.formatter = (row) => { |
| | | // æ ¡éªdetailsæ¯å¦åå¨ä¸ææ°æ® |
| | | if (row.details && row.details.length > 0) { |
| | | // æmaterielCodeåç»ç»è®¡stockQuantityæ»åï¼å¹¶è®°å½åä½ï¼å第ä¸ä¸ªé空åä½ï¼ |
| | | const materielSumMap = row.details.reduce((acc, item) => { |
| | | const materielCode = item.materielCode || 'æªç¥ç©æ'; |
| | | // æbarcode + supplyCode + BatchNo ç»å维度åç»ç»è®¡stockQuantityæ»åï¼å¹¶è®°å½åä½ï¼å第ä¸ä¸ªé空åä½ï¼ |
| | | const groupSumMap = row.details.reduce((acc, item) => { |
| | | // è·ååç»å
³é®å段ï¼ä¸ºç©ºæ¶èµäºé»è®¤å¼ |
| | | const supplyCode = item.supplyCode || 'æªç¥ä¾åºåç¼ç '; |
| | | const batchNo = item.batchNo || 'æªç¥æ¹æ¬¡å·'; |
| | | const materielCode = item.materielCode || 'æªç¥ç©æ'; // ä¿çåæç©æç¼ç |
| | | const quantity = Number(item.stockQuantity) || 0; |
| | | const unit = item.unit || ''; // è·ååä½ï¼æ å为空 |
| | | |
| | | // ç´¯å æ°é |
| | | acc[materielCode] = { |
| | | total: (acc[materielCode]?.total || 0) + quantity, |
| | | unit: acc[materielCode]?.unit || unit // ä¿ç第ä¸ä¸ªé空åä½ |
| | | // ç»ååç»é®ï¼å¯æ ¹æ®éè¦è°æ´æ¾ç¤ºæ ¼å¼ï¼ |
| | | const groupKey = `${supplyCode}|${batchNo}|${materielCode}`; |
| | | |
| | | // ç´¯å æ°éï¼ä¿ç第ä¸ä¸ªé空åä½ |
| | | acc[groupKey] = { |
| | | total: (acc[groupKey]?.total || 0) + quantity, |
| | | unit: acc[groupKey]?.unit || unit, |
| | | supplyCode, |
| | | batchNo, |
| | | materielCode |
| | | }; |
| | | return acc; |
| | | }, {}); |
| | | |
| | | // æ¯ä¸ªç©æé¡¹çæç¬ç«divï¼è·¨è¡æ¾ç¤ºï¼å
å«åä½ï¼ |
| | | const displayItems = Object.entries(materielSumMap).map(([code, data]) => { |
| | | // æ¯ä¸ªåç»é¡¹çæç¬ç«divï¼è·¨è¡æ¾ç¤ºï¼å
嫿æåç»ç»´åº¦ååä½ï¼ |
| | | const displayItems = Object.entries(groupSumMap).map(([_, data]) => { |
| | | // å¤çå使¾ç¤ºï¼æåä½åå ç©ºæ ¼æ¾ç¤ºï¼æ å䏿¾ç¤º |
| | | const unitText = data.unit ? ` ${data.unit}` : ''; |
| | | return `<div style="line-height: 1.5; white-space: normal;">${code}ï¼${data.total}${unitText}</div>`; |
| | | |
| | | // ç»è£
æ¾ç¤ºææ¬ï¼å¯æ ¹æ®éæ±è°æ´å段æ¾ç¤ºé¡ºåºåæ ¼å¼ï¼ |
| | | return `<div style="line-height: 1.5; white-space: normal; margin-bottom: 4px;"> |
| | | ä¾åºåç¼ç ï¼${data.supplyCode} | æ¹æ¬¡å·ï¼${data.batchNo} | ç©æç¼ç ï¼${data.materielCode}ï¼${data.total}${unitText} |
| | | </div>`; |
| | | }); |
| | | |
| | | const displayContent = displayItems.join(''); |
| | | return `<div style="color: #F56C6C; white-space: normal; word-break: break-all;">${displayContent}</div>`; |
| | | return `<div style="color: #716cf5ff; white-space: normal; word-break: break-all;">${displayContent}</div>`; |
| | | } else { |
| | | return '<span style="color: #F56C6C">空箱</span>'; |
| | | } |
| | |
| | | } |
| | | } |
| | | }) |
| | | |
| | | let SelectTake = this.buttons.find(x => x.value == 'SelectStockTake'); |
| | | if (SelectTake) { |
| | | // æ¹ä¸ºç®å¤´å½æ°ç¡®ä¿thisæåVueç»ä»¶å®ä¾ |
| | | SelectTake.onClick = async () => { |
| | | // è·åé䏿°æ®ï¼ä¸åé»è¾ä¸è´ï¼ç¡®ä¿æ¯æ°ç»æ ¼å¼ï¼ |
| | | let stockViews = this.$refs.table.getSelected(); |
| | | |
| | | // æ°æ®æ ¡éªï¼è³å°éæ©ä¸æ¡æ°æ® |
| | | if (stockViews.length === 0) return ElMessage.error("è¯·éæ©éè¦æä½çæ°æ®!"); |
| | | |
| | | // ç«å°é项ï¼å¯æ ¹æ®å®é
ä¸å¡è°æ´é项å¼ï¼ |
| | | const stationOptions = [ |
| | | { label: "ç«å°2", value: "2-1" }, |
| | | { label: "ç«å°3", value: "3-1" }, |
| | | { label: "ç«å°4", value: "4-1" }, |
| | | ]; |
| | | |
| | | // åå»ºå¼¹çªæè½½èç¹ |
| | | const mountNode = document.createElement("div"); |
| | | document.body.appendChild(mountNode); |
| | | |
| | | // è¡¨åæ°æ®ï¼ç»å®éä¸çç«å°ï¼ |
| | | const formData = reactive({ |
| | | outStation: stationOptions[0].value, // é»è®¤éä¸ç¬¬ä¸ä¸ªç«å° |
| | | }); |
| | | |
| | | // å建弹çªVNode |
| | | const vnode = createVNode( |
| | | ElDialog, |
| | | { |
| | | title: "åºåæä½ - éæ©åºåºç«å°", |
| | | width: "500px", |
| | | modelValue: true, |
| | | appendToBody: true, |
| | | "onUpdate:modelValue": (isVisible) => { |
| | | if (!isVisible) { |
| | | render(null, mountNode); |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | }, |
| | | style: { |
| | | padding: "20px 0", |
| | | borderRadius: "8px", |
| | | }, |
| | | }, |
| | | { |
| | | default: () => |
| | | h( |
| | | ElForm, |
| | | { |
| | | model: formData, |
| | | rules: { |
| | | outStation: [ |
| | | { required: true, message: "è¯·éæ©åºåºç«å°", trigger: "change" }, |
| | | ], |
| | | }, |
| | | ref: "stockTakeForm", // 表årefæ è¯ |
| | | labelWidth: "100px", |
| | | style: { |
| | | padding: "0 30px", |
| | | }, |
| | | }, |
| | | [ |
| | | // ç«å°éæ©ä¸ææ¡ |
| | | h(ElFormItem, { |
| | | label: "åºåºç«å°", |
| | | prop: "outStation", |
| | | style: { marginBottom: "24px" }, |
| | | }, [ |
| | | h(ElSelect, { |
| | | placeholder: "è¯·éæ©åºåºç«å°", |
| | | modelValue: formData.outStation, |
| | | "onUpdate:modelValue": (val) => { |
| | | formData.outStation = val; |
| | | }, |
| | | style: { |
| | | width: "100%", |
| | | height: "40px", |
| | | borderRadius: "4px", |
| | | borderColor: "#dcdfe6", |
| | | }, |
| | | }, stationOptions.map((station) => |
| | | h(ElOption, { label: station.label, value: station.value }) |
| | | )), |
| | | ]), |
| | | // åºé¨æé®åºå |
| | | h("div", { |
| | | style: { |
| | | textAlign: "right", |
| | | marginTop: "8px", |
| | | paddingRight: "4px", |
| | | }, |
| | | }, [ |
| | | // åæ¶æé® |
| | | h(ElButton, { |
| | | type: "text", |
| | | onClick: () => { |
| | | render(null, mountNode); |
| | | document.body.removeChild(mountNode); |
| | | ElMessage.info("åæ¶åºåæä½"); |
| | | }, |
| | | style: { marginRight: "8px", color: "#606266" }, |
| | | }, "åæ¶"), |
| | | // ç¡®å®æé® |
| | | h(ElButton, { |
| | | type: "primary", |
| | | onClick: async () => { |
| | | // ç¡®ä¿è¡¨årefå·²æè½½ |
| | | await this.$nextTick(); |
| | | const formRef = vnode.component.refs.stockTakeForm; |
| | | |
| | | if (!formRef) { |
| | | ElMessage.error("表ååå§å失败ï¼è¯·éè¯"); |
| | | return; |
| | | } |
| | | |
| | | // 表åéªè¯ |
| | | try { |
| | | await formRef.validate(); |
| | | } catch (err) { |
| | | return; |
| | | } |
| | | |
| | | const requestBody = stockViews; |
| | | const outStation = formData.outStation; |
| | | |
| | | try { |
| | | |
| | | const url = `api/Task/TakeOutbound?outStation=${encodeURIComponent(outStation)}`; |
| | | |
| | | const x = await this.http.post( |
| | | url, // 带æ¥è¯¢åæ°çURL |
| | | requestBody, // 请æ±ä½ï¼stockViewsæ°ç» |
| | | "æ°æ®å¤çä¸" |
| | | ); |
| | | |
| | | if (!x.status) { |
| | | ElMessage.error(x.message || "åºåæä½å¤±è´¥"); |
| | | return; |
| | | } |
| | | |
| | | ElMessage.success("æä½æå"); |
| | | this.refresh(); // åå·æ°é»è¾ä¿ç |
| | | } catch (error) { |
| | | console.error("åºåæ¥å£è¯·æ±å¤±è´¥ï¼", error); |
| | | ElMessage.error("请æ±å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } finally { |
| | | // æ 论æå失败ï¼å
³éå¼¹çª |
| | | render(null, mountNode); |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | }, |
| | | style: { borderRadius: "4px", padding: "8px 20px" }, |
| | | }, "ç¡®å®æä½"), |
| | | ]), |
| | | ]), |
| | | } |
| | | ); |
| | | |
| | | // ç»å®appä¸ä¸æï¼ç¡®ä¿å¼¹çªå
ç»ä»¶æ£å¸¸å·¥ä½ï¼ |
| | | vnode.appContext = this.$.appContext; |
| | | render(vnode, mountNode); |
| | | }; |
| | | } |
| | | }, |
| | | onInited() { |
| | | //æ¡æ¶åå§åé
ç½®å |