From 6e19fb9ba681721c9e827f079a2b38c4e3fb1288 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 29 十月 2025 14:30:09 +0800
Subject: [PATCH] 页面调整

---
 seller/src/views/order/order/orderDetail.vue |  473 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 465 insertions(+), 8 deletions(-)

diff --git a/seller/src/views/order/order/orderDetail.vue b/seller/src/views/order/order/orderDetail.vue
index fbfd09b..b67aa3b 100644
--- a/seller/src/views/order/order/orderDetail.vue
+++ b/seller/src/views/order/order/orderDetail.vue
@@ -5,6 +5,8 @@
         <Button v-if="allowOperation.editPrice" @click="modifyPrice" type="primary">璋冩暣浠锋牸</Button>
         <Button v-if="allowOperation.editConsignee" @click="editAddress" type="primary">淇敼鏀惰揣鍦板潃</Button>
         <Button v-if="allowOperation.showLogistics || orderPackage.length > 0" @click="checkLogistics" type="primary">鏌ョ湅鐗╂祦</Button>
+        <!-- 娣诲姞淇敼鐗╂祦鍗曞彿鎸夐挳 -->
+        <Button v-if="allowOperation.showLogistics || orderPackage.length > 0" @click="modifyLogisticsNo" type="primary">淇敼鐗╂祦鍗曞彿</Button>
         <Button @click="orderLogModal = true" type="primary">璁㈠崟鏃ュ織</Button>
         <Button @click="printOrder" type="primary" ghost style="float:right;">鎵撳嵃鍙戣揣鍗�</Button>
         <Button v-if="allowOperation.take" @click="orderTake" type="primary">璁㈠崟鏍搁攢</Button>
@@ -17,6 +19,10 @@
         <Button @click="toPrint" type="primary" ghost
           v-if="allowOperation.ship && logisticsType != 'SHUNFENG'">鎵撳嵃鐢靛瓙闈㈠崟</Button>
         <Button @click="modifyRemark" type="primary">娣诲姞澶囨敞</Button>
+        <!-- 灏嗙紪杈戞ā鏉挎寜閽Щ鍒拌繖閲� -->
+        <Button v-if="orderInfo.userCheckTemplates && orderInfo.userCheckTemplates.length > 0"
+                @click="editTemplateInfo(orderInfo.userCheckTemplates[0].templateId, sn)"
+                type="primary">缂栬緫妯℃澘</Button>
       </div>
     </Card>
 
@@ -146,7 +152,63 @@
             }}
           </div>
         </div>
+
         </Col>
+        <Col span="24">
+          <!-- 澶栧眰瀹瑰櫒锛氬惊鐜亶鍘� userCheckTemplates 闆嗗悎 -->
+          <div class="check-template-list">
+              <div class="template-item" v-for="(item, index) in orderInfo.userCheckTemplates" :key="item.id">
+                <!-- 2. 妯℃澘鏍囬锛氫粎绗竴涓惊鐜」鏄剧ず templateName锛坕ndex===0 鎺у埗锛� -->
+                <div class="div-item" > <!-- 鍏抽敭锛氫粎棣栭」娓叉煋 -->
+                  <div class="div-item-left">鍟嗗搧妯℃澘锛�</div>
+                  <div class="div-item-right">
+                    {{ item.templateName || '鏃犳ā鏉挎爣棰�' }} <!-- 澶勭悊绌哄�奸粯璁ゆ樉绀� -->
+                  </div>
+                </div>
+                <!-- 4. 閫夋嫨鍥剧墖锛氭覆鏌� chooseImg 瀛楁锛堝鐞� null/绌哄�硷級 -->
+                <div class="div-item">
+                  <div class="div-item-left">妯℃澘鍥剧墖锛�</div>
+                  <div class="div-item-right">
+                    <img
+                      v-if="item.chooseImg"
+                      :src="getImageUrl(item.chooseImg)"
+                      alt="閫夋嫨鐨勫浘鐗�"
+                      class="selected-img"
+                      style="max-width: 200px; max-height: 150px;"
+                    >
+                    <span v-else>鏃犻�夋嫨鍥剧墖</span> <!-- 鏃犲浘鐗囨椂榛樿鏂囨湰 -->
+                  </div>
+                </div>
+            <!-- 1. 鍟嗗搧妯℃澘锛氭瘡涓惊鐜」閮芥樉绀� subName -->
+            <div class="div-item">
+              <div class="div-item-left">妯℃澘鏍囬锛�</div>
+              <div class="div-item-right">
+                {{ item.subName || '鏃犲晢鍝佹ā鏉垮悕绉�' }} <!-- 澶勭悊绌哄�奸粯璁ゆ樉绀� -->
+              </div>
+            </div>
+
+            <!-- 3. 鏂囨湰鍐呭锛氬垽鏂� content 鏄�屽浘鐗嘦RL銆嶈繕鏄�岀函鏂囨湰銆� -->
+            <div class="div-item">
+              <div class="div-item-left">{{isUrl(item.content)? '鍥剧墖锛�':'鏂囨湰鍐呭'}}</div>
+              <div class="div-item-right">
+                <!-- 姝e垯鍒ゆ柇锛歝ontent 浠� http/https 寮�澶� 鈫� 娓叉煋鍥剧墖锛涘惁鍒欐覆鏌撴枃鏈� -->
+                <img
+                  v-if="isUrl(item.content)"
+                  :src="getImageUrl(item.content)"
+                  alt="鍐呭鍥剧墖"
+                  class="content-img"
+                  style="max-width: 200px; max-height: 150px;"
+                >
+                <span v-else>{{ item.content || '鏃犳枃鏈唴瀹�' }}</span> <!-- 绾枃鏈�/绌哄�煎鐞� -->
+              </div>
+            </div>
+
+            <!-- 鍙�夛細寰幆椤瑰垎闅旂嚎锛屼紭鍖栬瑙� -->
+            <hr v-if="index !== orderInfo.userCheckTemplates.length - 1" style="margin: 15px 0; border: none; border-top: 1px solid #eee;">
+          </div>
+          </div>
+        </Col>
+
       </Row>
     </Card>
 
@@ -379,6 +441,10 @@
       <div v-if="packageTraceList.length > 0" v-for="(packageItem, packageIndex) in packageTraceList" :key="packageIndex">
         <div class="layui-layer-wrap">
           <dl>
+            <dt>鍖呰9缂栧彿锛�</dt>
+            <dd><div class="text-box">{{ packageItem.packageNo }}</div></dd>
+          </dl>
+          <dl>
             <dt>鐗╂祦鍏徃锛�</dt>
             <dd><div class="text-box">{{ packageItem.logisticsName }}</div></dd>
           </dl>
@@ -404,6 +470,10 @@
             </ul>
             <ul class="express-log" v-else><li>鏆傛棤鐗╂祦淇℃伅</li></ul>
           </div>
+          <!-- 娣诲姞淇敼鐗╂祦鍗曞彿鎸夐挳 -->
+          <div style="text-align: center; margin-top: 10px;">
+            <Button type="primary" @click="modifyPackageLogistics(packageItem)">淇敼鐗╂祦鍗曞彿</Button>
+          </div>
         </div>
       </div>
       <div v-if = "packageTraceList.length == 0 && logisticsInfo">
@@ -425,6 +495,10 @@
             </ul>
             <ul class="express-log" v-else><li>鏆傛棤鐗╂祦淇℃伅</li></ul>
           </div>
+          <!-- 娣诲姞淇敼鐗╂祦鍗曞彿鎸夐挳 -->
+          <div style="text-align: center; margin-top: 10px;">
+            <Button type="primary" @click="modifySingleLogistics">淇敼鐗╂祦鍗曞彿</Button>
+          </div>
         </div>
       </div>
       <div slot="footer" style="text-align: right">
@@ -432,7 +506,38 @@
       </div>
     </Modal>
 
-
+    <!-- 淇敼鐗╂祦鍗曞彿寮圭獥 -->
+    <Modal v-model="modifyLogisticsModal" width="530">
+      <p slot="header">
+        <Icon type="edit"></Icon>
+        <span>淇敼鐗╂祦鍗曞彿</span>
+      </p>
+      <div>
+        <Form ref="modifyLogisticsForm" :model="modifyLogisticsForm" label-position="left" :label-width="100" :rules="modifyLogisticsValidate">
+          <FormItem label="鍖呰9缂栧彿" prop="packageNo">
+            <Input v-model="modifyLogisticsForm.packageNo" size="large" disabled></Input>
+          </FormItem>
+          <FormItem label="璁㈠崟缂栧彿" prop="orderSn">
+            <Input v-model="modifyLogisticsForm.orderSn" size="large" disabled></Input>
+          </FormItem>
+          <FormItem label="蹇�掑叕鍙�" prop="logisticsId">
+            <Select v-model="modifyLogisticsForm.logisticsId" placeholder="璇烽�夋嫨蹇�掑叕鍙�" style="width: 100%">
+              <Option v-for="(item, i) in checkedLogistics" :key="i" :value="item.logisticsId">{{ item.name }}</Option>
+            </Select>
+          </FormItem>
+          <FormItem label="蹇�掑崟鍙�" prop="logisticsNo">
+            <Input v-model="modifyLogisticsForm.logisticsNo" size="large"></Input>
+          </FormItem>
+          <FormItem label="蹇�掔紪鐮�" prop="logisticsCode">
+            <Input v-model="modifyLogisticsForm.logisticsCode" size="large"></Input>
+          </FormItem>
+        </Form>
+      </div>
+      <div slot="footer" style="text-align: right">
+        <Button @click="modifyLogisticsModal = false">鍏抽棴</Button>
+        <Button type="primary" @click="modifyLogisticsSubmit">纭淇敼</Button>
+      </div>
+    </Modal>
     <!-- 璁㈠崟鍙戣揣 -->
     <Modal v-model="orderDeliverModal" width="500px">
       <p slot="header">
@@ -527,7 +632,7 @@
       </div>
     </Modal>
     <!--璁㈠崟鍒嗗寘瑁瑰彂璐�-->
-    <Modal v-model="groupShipModal" :loading="shipLoading" title="鍒嗗寘瑁瑰彂蹇��" width="1000">
+    <Modal v-model="groupShipModal" :loading="shipLoading" title="鍒嗗寘瑁瑰彂蹇��" width="1300">
       <div>
         <Form ref="groupOrderDeliveryForm" :model="groupOrderDeliveryForm" :label-width="90" :rules="groupOrderDeliverFormValidate" style="position: relative">
           <FormItem label="鐗╂祦鍏徃" prop="logisticsId">
@@ -571,7 +676,7 @@
           </div>
         </template>
         <template slot="numSlot" slot-scope="{ row, index }">
-          <InputNumber :min="0" :max="row.___num - row.deliverNumber" v-model="data[index].canNum">
+          <InputNumber :min="0" :max="row.___num - row.deliverNumber - row.returnGoodsNumber" v-model="data[index].canNum">
           </InputNumber>
         </template>
       </Table>
@@ -582,6 +687,16 @@
     </Modal>
 
     <multipleMap ref="map" @callback="getAddress"></multipleMap>
+
+    <!-- 娣诲姞妯℃澘缂栬緫寮圭獥 -->
+    <EditTemplateModal
+      v-model="editTemplateModalVisible"
+      :template-id="currentTemplateId"
+      :order-sn="sn"
+      :user-check-templates="orderInfo.userCheckTemplates"
+      @success="handleTemplateEditSuccess"
+      @cancel="editTemplateModalVisible = false"
+    />
   </div>
 </template>
 
@@ -589,17 +704,23 @@
 import * as API_Order from "@/api/order";
 import * as API_Logistics from "@/api/logistics";
 import * as RegExp from "@/libs/RegExp.js";
+import { getSts } from "@/api/file";
 
 import multipleMap from "@/views/my-components/map/multiple-map";
-
+import EditTemplateModal from "./editTemplateModal.vue";
 
 export default {
   name: "orderDetail",
   components: {
     multipleMap,
+    EditTemplateModal
   },
   data () {
     return {
+      // isPreviewVisible: false,
+      // currentPreviewImage: '',
+      // currentPreviewIndex: 0,
+
       loading:false,
       typeList: [],
       showPrices: false,
@@ -611,6 +732,7 @@
       },
       submitLoading: false, // 娣诲姞鎴栫紪杈戞彁浜ょ姸鎬�
       logisticsType: 'KUAIDINIAO', //鐗╂祦绫诲瀷
+      endpoint: '', // 娣诲姞endpoint鍙橀噺鐢ㄤ簬瀛樺偍STS endpoint
 
       someJSONdata: '',
       faceSheetForm: {
@@ -760,7 +882,6 @@
             );
           },
         },
-
         {
           title: "鏁伴噺",
           key: "num",
@@ -776,6 +897,55 @@
               this.$options.filters.unitPrice(params.row.flowPrice, "锟�")
             );
           },
+        },
+        {
+          title: "閫�娆炬暟閲�",
+          key: "returnGoodsNumber",
+          minWidth: 80,
+        },
+        {
+          title: "閫�娆鹃噾棰�",
+          key: "refundPrice",
+          minWidth: 80,
+        },
+        {
+          title: "閫�娆剧姸鎬�",
+          key: "isRefund",
+          minWidth: 80,
+          render:(h, params) => {
+            if(params.row.isRefund==='NO_REFUND'){
+              return h(
+                "div",
+                "鏈��娆�"
+              );
+            }else if(params.row.isRefund==='ALL_REFUND'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "鍏ㄩ儴閫�娆�"
+              );
+            }else if(params.row.isRefund==='PART_REFUND'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "閮ㄥ垎閫�娆�"
+              );
+            }else if(params.row.isRefund==='REFUNDING'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "閫�娆句腑"
+              );
+            }
+            else {
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "鏈煡鐘舵��"
+              );
+            }
+
+          }
         },
       ],
       data: [], // 鍟嗗搧琛ㄥ崟鏁版嵁
@@ -807,6 +977,7 @@
 
       // 鍒嗗寘瑁瑰彂璐�
       groupShipModal: false,
+      groupShipModalOpened: false, // 鏍囪瘑鍒嗗寘瑁瑰彂璐у脊绐楁槸鍚﹀凡鎵撳紑杩�
       shipLoading: true,
       groupOrderDeliveryForm: {
         logisticsNo: "", //鍙戣揣鍗曞彿
@@ -849,19 +1020,136 @@
             return h("div", this.$options.filters.unitPrice(params.row.subTotal, "锟�"));
           },
         },
+        {
+          title: "閫�娆炬暟閲�",
+          key: "returnGoodsNumber",
+          minWidth: 80,
+        },
+        {
+          title: "閫�娆鹃噾棰�",
+          key: "refundPrice",
+          minWidth: 80,
+        },
+        {
+          title: "閫�娆剧姸鎬�",
+          key: "isRefund",
+          minWidth: 80,
+          render:(h, params) => {
+            if(params.row.isRefund==='NO_REFUND'){
+              return h(
+                "div",
+                "鏈��娆�"
+              );
+            }else if(params.row.isRefund==='ALL_REFUND'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "鍏ㄩ儴閫�娆�"
+              );
+            }else if(params.row.isRefund==='PART_REFUND'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "閮ㄥ垎閫�娆�"
+              );
+            }else if(params.row.isRefund==='REFUNDING'){
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "閫�娆句腑"
+              );
+            }
+            else {
+              return h(
+                "div",
+                { style: {color:"red"} },
+                "鏈煡鐘舵��"
+              );
+            }
+
+          }
+        },
       ],
       orderPackage: [],
-      packageTraceList: []
+      packageTraceList: [],
+      // 娣诲姞妯℃澘缂栬緫寮圭獥鐩稿叧鏁版嵁
+      editTemplateModalVisible: false,
+      currentTemplateId: "",
+      // 鐢ㄤ簬浼犻�抲serCheckTemplates鏁版嵁缁欏瓙缁勪欢
+      userCheckTemplates: [],
+
+      // 娣诲姞淇敼鐗╂祦鍗曞彿鐩稿叧鏁版嵁
+      modifyLogisticsModal: false, // 寮瑰嚭淇敼鐗╂祦鍗曞彿妗�
+      modifyLogisticsForm: {
+        packageNo: "",
+        orderSn: "",
+        logisticsId: "",
+        logisticsNo: "",
+        logisticsCode: ""
+      },
+      modifyLogisticsValidate: {
+        logisticsId: [
+          { required: true, message: "璇烽�夋嫨蹇�掑叕鍙�", trigger: "change" }
+        ],
+        logisticsNo: [
+          { required: true, message: "璇疯緭鍏ュ揩閫掑崟鍙�", trigger: "blur" }
+        ]
+      },
+
     };
   },
   methods: {
+    isUrl(str) {
+      if (!str) return false; // 绌哄�肩洿鎺ヨ繑鍥瀎alse
+      // 姝e垯璇存槑锛�
+      // 1. https?:// 锛氭敮鎸乭ttp/https鍗忚
+      // 2. ([\w-]+\.)+ 锛氬厑璁稿瓙鍩熷悕鍖呭惈鐭í绾匡紙濡俵mk-1356772813锛�
+      // 3. [a-zA-Z]{2,} 锛氶《绾у煙鍚嶏紙濡俢om銆乧n锛岃嚦灏�2涓瓧姣嶏級
+      // 4. (\w-./?%&=)* 锛歎RL璺緞/鍙傛暟閮ㄥ垎锛屾敮鎸佸父瑙佸瓧绗�
+      // 5. \.(jpg|jpeg|png|gif|bmp|webp)$ 锛氫粎鍖归厤甯歌鍥剧墖鍚庣紑锛屽拷鐣ュぇ灏忓啓锛坕鏍囧織锛�
+      const imgReg = /^https?:\/\/([\w-]+\.)+[a-zA-Z]{2,}(\/[\w-./?%&=]*)*\.(jpg|jpeg|png|gif|bmp|webp)$/i;
+      return imgReg.test(str);
+    },
+    // 鑾峰彇鍥剧墖URL锛堜娇鐢⊿TS鑾峰彇鐨別ndpoint锛�
+    getImageUrl(fileKey) {
+      // 纭繚fileKey鏄瓧绗︿覆绫诲瀷
+      if (!fileKey || typeof fileKey !== 'string') {
+        console.warn('fileKey is not a valid string:', fileKey);
+        return ''; // 杩斿洖绌哄瓧绗︿覆鎴栭粯璁ゅ浘鐗�
+      }
+
+      // 瀹夊叏妫�鏌tartsWith鏂规硶鏄惁瀛樺湪
+      if (fileKey.startsWith && typeof fileKey.startsWith === 'function' &&
+          (fileKey.startsWith("http://") || fileKey.startsWith("https://"))) {
+        return fileKey;
+      }
+
+      // 濡傛灉鏈塭ndpoint閰嶇疆锛屼娇鐢╡ndpoint鎷兼帴URL
+      if (this.endpoint) {
+        // 纭繚fileKey涓嶄互/寮�澶达紝endpoint涓嶄互/缁撳熬
+        const cleanEndpoint = this.endpoint.replace(/\/$/, '');
+        const cleanFileKey = fileKey.replace(/^\//, '');
+        return `${cleanEndpoint}/${cleanFileKey}`;
+      }
+
+      // 鍚﹀垯杩斿洖fileKey锛岃缁勪欢鑷繁澶勭悊
+      return fileKey;
+    },
     // 閫変腑
     selectGroupShipGoodsMethods (selected) {
+      console.log('selectGroupShipGoodsMethods琚皟鐢�, selected:', JSON.stringify(selected));
+      // 绠�鍖栭�昏緫锛岀洿鎺ヤ繚瀛橀�変腑鐨勫晢鍝侊紝鏁伴噺鍦ㄦ彁浜ゆ椂浠巇ata鏁扮粍鑾峰彇
       this.selectGroupShipGoods = selected;
+      console.log('selectGroupShipGoods宸叉洿鏂�');
     },
     // 鍒嗗寘瑁瑰彂璐�
     groupShip () {
       this.groupShipModal = true;
+      this.groupShipModalOpened = true; // 鏍囪寮圭獥宸叉墦寮�
+      this.groupOrderDeliveryForm = {
+        logisticsNo: "", //鍙戣揣鍗曞彿
+        logisticsId: "", //鐗╂祦鍏徃
+      }
       this.getLogisticsList();
     },
     // 鍒嗛〉鑾峰彇鐗╂祦鍏徃
@@ -874,6 +1162,7 @@
     },
     // 鍒嗗寘瑁瑰彂璐�
     confirmShipGroupGoods () {
+      console.log('琛ㄥ崟鍘熷鏁版嵁--------------------------銆�',JSON.stringify(this.selectGroupShipGoods))
       this.$refs.groupOrderDeliveryForm.validate(async (valid) => {
         if (valid) {
           if (this.selectGroupShipGoods.length) {
@@ -881,16 +1170,33 @@
               ...this.groupOrderDeliveryForm,
               orderSn: this.sn,
               partDeliveryDTOList: this.selectGroupShipGoods.map((item) => {
+                // 鐩存帴浠巇ata鏁扮粍涓幏鍙栨渶鏂扮殑canNum鍊硷紝鑰屼笉渚濊禆閫夋嫨鏃剁殑鏁版嵁
+                const currentDataItem = this.data.find(d => d.id === item.id);
+                const finalDeliveryNum = currentDataItem ? currentDataItem.canNum : item.num;
+
+                console.log('澶勭悊鍟嗗搧椤�:', {
+                  id: item.id,
+                  selectedCanNum: item.canNum,
+                  dataCanNum: currentDataItem?.canNum,
+                  num: item.num,
+                  finalDeliveryNum: finalDeliveryNum
+                });
+
                 return {
                   orderItemId: item.id,
-                  deliveryNum: item.canNum ? item.canNum : item.num,
+                  deliveryNum: finalDeliveryNum,
                 };
               }),
             };
+            console.log('---------------------->',JSON.stringify(submit));
             const res = await API_Order.partDelivery(this.sn, submit);
             if (res.success) {
               this.$Message.success("鍙戣揣鎴愬姛!");
               this.shipLoading = false;
+              // 娓呯┖閫変腑鐨勫晢鍝佹暟鎹紝閬垮厤鏁版嵁娈嬬暀
+              this.selectGroupShipGoods = [];
+              // 閲嶇疆寮圭獥鎵撳紑鏍囪瘑锛屼笅娆℃墦寮�鏃舵樉绀洪粯璁ゅ��
+              this.groupShipModalOpened = false;
               this.getDataDetail();
               this.getOrderPackage();
               this.groupShipModal = false;
@@ -987,13 +1293,21 @@
           this.allowOperation = res.result.allowOperationVO;
           if (res.result.orderItems.length) {
             this.data = res.result.orderItems.map((item) => {
+              // 鍙湪寮圭獥鎵撳紑鐘舵�佷笅鎵嶄繚鐣欑敤鎴蜂慨鏀圭殑canNum鍊�
+              const existingItem = this.groupShipModalOpened ? this.data.find(d => d.id === item.id) : null;
+              const defaultCanNum = item.num - item.deliverNumber - item.returnGoodsNumber;
+
               return {
                 ...item,
                 ___num: item.num,
                 _disabled: item.deliverNumber >= item.num,
-                canNum: item.num - item.deliverNumber
+                // 濡傛灉寮圭獥宸叉墦寮�涓旂敤鎴峰凡缁忎慨鏀硅繃canNum涓斿�煎悎鐞嗭紝鍒欎繚鐣欙紱鍚﹀垯浣跨敤榛樿鍊�
+                canNum: (existingItem && existingItem.canNum !== undefined && existingItem.canNum <= defaultCanNum)
+                  ? existingItem.canNum
+                  : defaultCanNum
               };
             });
+            console.log('---------------------->璁㈠崟璇︽儏',this.data)
           }
           this.orderLogData = res.result.orderLogs;
           this.typeList = JSON.parse(JSON.stringify(res.result.order.priceDetailDTO.discountPriceDetail));
@@ -1071,6 +1385,7 @@
       }
     },
     logisticsList () {
+      this.packageTraceList = []
       this.logisticsModal = true;
       API_Order.getPackage(this.sn).then((res) => {
         if (res.success && res.result != null) {
@@ -1215,12 +1530,128 @@
       })
     },
 
+    // 鑾峰彇STS淇℃伅
+    // async getStsInfo() {
+    //   try {
+    //     const stsRes = await getSts();
+    //     if (stsRes.success) {
+    //       this.endpoint = stsRes.data.endpoint;
+    //     }
+    //   } catch (error) {
+    //     console.error('鑾峰彇STS淇℃伅澶辫触:', error);
+    //   }
+    // },
+
+    // 缂栬緫妯℃澘淇℃伅
+    editTemplateInfo(templateId, orderSn) {
+      console.log("璋冪敤editTemplateInfo锛屽弬鏁�:", {
+        templateId: templateId,
+        orderSn: orderSn
+      });
+      this.currentTemplateId = templateId;
+      // 鏇存柊userCheckTemplates鏁版嵁
+      this.userCheckTemplates = this.orderInfo.userCheckTemplates || [];
+      this.editTemplateModalVisible = true;
+    },
+
+    // 妯℃澘缂栬緫鎴愬姛鍥炶皟
+    handleTemplateEditSuccess() {
+      this.editTemplateModalVisible = false;
+      // 鍙互鍦ㄨ繖閲屽埛鏂版暟鎹垨鎻愮ず鐢ㄦ埛
+      this.$Message.success("妯℃澘淇℃伅宸叉洿鏂�");
+      // 鍒锋柊璁㈠崟璇︽儏椤甸潰鏁版嵁
+      this.getDataDetail();
+    },
+
+    getStsInfo() {
+      getSts().then(res => {
+        if (res.code==200) {
+          this.endpoint = res.data.endpoint;
+        }
+      });
+    },
+
+    // 娣诲姞淇敼鐗╂祦鍗曞彿鏂规硶
+    modifyLogisticsNo() {
+      // 鑾峰彇鐗╂祦鍏徃鍒楄〃
+      this.getLogisticsList();
+
+      // 鍒濆鍖栬〃鍗曟暟鎹�
+      this.modifyLogisticsForm.orderSn = this.sn;
+
+      // 濡傛灉鏈夊寘瑁逛俊鎭紝鍒濆鍖栫涓�涓寘瑁圭殑淇℃伅
+      if (this.orderPackage && this.orderPackage.length > 0) {
+        const firstPackage = this.orderPackage[0];
+        this.modifyLogisticsForm.packageNo = firstPackage.packageNo || "";
+        this.modifyLogisticsForm.logisticsId = firstPackage.logisticsId || "";
+        this.modifyLogisticsForm.logisticsNo = firstPackage.logisticsNo || "";
+        this.modifyLogisticsForm.logisticsCode = firstPackage.logisticsCode || "";
+      }
+
+      this.modifyLogisticsModal = true;
+    },
+
+    // 淇敼鎸囧畾鍖呰9鐨勭墿娴佸崟鍙�
+    modifyPackageLogistics(packageItem) {
+      // 鑾峰彇鐗╂祦鍏徃鍒楄〃
+      this.getLogisticsList();
+
+      // 鍒濆鍖栬〃鍗曟暟鎹�
+      this.modifyLogisticsForm.packageNo = packageItem.packageNo || "";
+      this.modifyLogisticsForm.orderSn = this.sn;
+      this.modifyLogisticsForm.logisticsId = packageItem.logisticsId || "";
+      this.modifyLogisticsForm.logisticsNo = packageItem.logisticsNo || "";
+      this.modifyLogisticsForm.logisticsCode = packageItem.logisticsCode || "";
+
+      // 鍏抽棴鏌ョ湅鐗╂祦寮圭獥锛屾墦寮�淇敼鐗╂祦寮圭獥
+      this.logisticsModal = false;
+      this.modifyLogisticsModal = true;
+    },
+
+    // 淇敼鍗曚釜鐗╂祦鍗曞彿锛堥潪鍒嗗寘瑁规儏鍐碉級
+    modifySingleLogistics() {
+      // 鑾峰彇鐗╂祦鍏徃鍒楄〃
+      this.getLogisticsList();
+
+      // 鍒濆鍖栬〃鍗曟暟鎹�
+      this.modifyLogisticsForm.orderSn = this.sn;
+      this.modifyLogisticsForm.logisticsId = "";
+      this.modifyLogisticsForm.logisticsNo = this.logisticsInfo.logisticCode || "";
+      this.modifyLogisticsForm.logisticsCode = "";
+
+      // 鍏抽棴鏌ョ湅鐗╂祦寮圭獥锛屾墦寮�淇敼鐗╂祦寮圭獥
+      this.logisticsModal = false;
+      this.modifyLogisticsModal = true;
+    },
+
+    // 淇敼鐗╂祦鍗曞彿鎻愪氦
+    modifyLogisticsSubmit() {
+      this.$refs.modifyLogisticsForm.validate((valid) => {
+        if (valid) {
+          API_Order.updateTraces(this.modifyLogisticsForm).then((res) => {
+            if (res.success) {
+              this.$Message.success("淇敼鐗╂祦鍗曞彿鎴愬姛");
+              this.modifyLogisticsModal = false;
+              // 閲嶆柊鑾峰彇璁㈠崟璇︽儏鍜屽寘瑁逛俊鎭�
+              this.getDataDetail();
+              this.getOrderPackage();
+              // 閲嶆柊鍔犺浇鐗╂祦淇℃伅
+              this.checkLogistics();
+            } else {
+              this.$Message.error(res.message || "淇敼鐗╂祦鍗曞彿澶辫触");
+            }
+          });
+        }
+      });
+    },
+
   },
   mounted () {
     this.sn = this.$route.query.sn;
     this.getDataDetail();
     this.getLogisticsSetting();
     this.getOrderPackage();
+    this.getStsInfo(); // 娣诲姞杩欒鏉ヨ幏鍙朣TS淇℃伅
   },
   // 濡傛灉鏄粠璇︽儏椤佃繑鍥炲垪琛ㄩ〉锛屼慨鏀瑰垪琛ㄩ〉keepAlive涓簍rue锛岀‘淇濅笉鍒锋柊椤甸潰
   beforeRouteLeave (to, from, next) {
@@ -1447,4 +1878,30 @@
     height: inherit;
   }
 }
+.check-template-list {
+  display: flex;
+  flex-wrap: wrap; // 鍏抽敭锛氬浣欏瓙椤硅嚜鍔ㄦ崲琛�
+  gap: 15px; // 瀛愰」涔嬮棿鐨勯棿璺濓紙姘村钩+鍨傜洿锛�
+  padding: 10px 0; // 涓婁笅鍐呰竟璺濓紝閬垮厤璐磋竟
+  width: 100%; // 鍗犳弧鐖跺鍣紙Col span="12"锛�
+}
+
+// 2. 姣忎釜妯℃澘椤癸細鎺у埗瀹藉害鍜屽崱鐗囨牱寮�
+.template-item {
+  min-width: 280px; // 鏈�灏忓搴︼紝閬垮厤杩囩獎
+  max-width: 350px; // 鏈�澶у搴︼紝闃叉杩囧
+  flex: 1; // 鍚屼竴琛屽瓙椤瑰潎鍖�鍒嗛厤瀹藉害
+  padding: 12px;
+  border: 1px solid #eee;
+  border-radius: 6px;
+  background-color: #fafafa;
+  box-sizing: border-box; // 闃叉padding鎾戝ぇ瀹藉害
+}
+.content-img,
+.selected-img {
+  max-width: 100%; // 閫傚簲瀛愰」瀹藉害
+  max-height: 150px; // 闄愬埗鏈�澶ч珮搴�
+  border-radius: 4px;
+  object-fit: cover; // 淇濇寔鍥剧墖姣斾緥锛屼笉鎷変几
+}
 </style>

--
Gitblit v1.8.0