Przeglądaj źródła

bug-555和bug-556

张田田 3 miesięcy temu
rodzic
commit
75a20b6619

+ 2 - 2
src/order/DateTimePicker.vue

@@ -577,8 +577,8 @@ function handleClose() {
           box-sizing: border-box;
           box-sizing: border-box;
 
 
           &:hover:not(.disabled) {
           &:hover:not(.disabled) {
-            border-color: #8bc34a !important;
-            background: #f9fff9 !important;
+            // border-color: #8bc34a !important;
+            // background: #f9fff9 !important;
           }
           }
 
 
           &.active {
           &.active {

+ 66 - 13
src/order/DispatchOrderPanel.vue

@@ -46,6 +46,8 @@ const orderCounts = ref({
 
 
 // 当前订单的分配机构输入值
 // 当前订单的分配机构输入值
 const assignedInstitutionMap = ref<Record<number, string>>({});
 const assignedInstitutionMap = ref<Record<number, string>>({});
+// 记录是否从右边列表选择指派(用于控制按钮显示)
+const assignedFromRightList = ref<Record<number, boolean>>({});
 
 
 // 日期时间选择弹窗相关
 // 日期时间选择弹窗相关
 const dateTimePickerVisible = ref(false);
 const dateTimePickerVisible = ref(false);
@@ -201,6 +203,8 @@ watch(activeSubTab, async () => {
   allInstitutionData.value = [];
   allInstitutionData.value = [];
   institutionList.value = [];
   institutionList.value = [];
   gridRef.value?.loadData([]);
   gridRef.value?.loadData([]);
+  // 切换tab时,清空所有按钮显示标记,这样按钮就不会显示
+  assignedFromRightList.value = {};
   await loadOrderCounts();
   await loadOrderCounts();
   await loadOrderList();
   await loadOrderList();
   if (orderList.value.length > 0) {
   if (orderList.value.length > 0) {
@@ -216,6 +220,7 @@ watch(activeSubTab, async () => {
       orderList.value.forEach(order => {
       orderList.value.forEach(order => {
         const orderId = getOrderId(order);
         const orderId = getOrderId(order);
         assignedInstitutionMap.value[orderId] = '';
         assignedInstitutionMap.value[orderId] = '';
+        assignedFromRightList.value[orderId] = false;
       });
       });
     }
     }
     await loadInstitutionList();
     await loadInstitutionList();
@@ -232,6 +237,8 @@ watch(() => props.orderType, async () => {
   activeSubTab.value = 'pending';
   activeSubTab.value = 'pending';
   selectedOrderId.value = null;
   selectedOrderId.value = null;
   assignedInstitutionMap.value = {};
   assignedInstitutionMap.value = {};
+  // 切换订单类型时,清空所有按钮显示标记
+  assignedFromRightList.value = {};
   orderPageConfig.currentPage = 1;
   orderPageConfig.currentPage = 1;
   searchForm.customerName = '';
   searchForm.customerName = '';
   searchForm.contactPhone = '';
   searchForm.contactPhone = '';
@@ -270,6 +277,7 @@ watch(() => props.orderType, async () => {
       orderList.value.forEach(order => {
       orderList.value.forEach(order => {
         const orderId = getOrderId(order);
         const orderId = getOrderId(order);
         assignedInstitutionMap.value[orderId] = '';
         assignedInstitutionMap.value[orderId] = '';
+        assignedFromRightList.value[orderId] = false;
       });
       });
     }
     }
     // 选中订单后必须加载机构列表(切换订单类型时)
     // 选中订单后必须加载机构列表(切换订单类型时)
@@ -569,6 +577,7 @@ function handleDateChange(orderId: number, date: Dayjs | null) {
 
 
   // 清空分配机构
   // 清空分配机构
   assignedInstitutionMap.value[orderId] = '';
   assignedInstitutionMap.value[orderId] = '';
+  assignedFromRightList.value[orderId] = false;
 
 
   loadInstitutionList();
   loadInstitutionList();
 }
 }
@@ -596,6 +605,7 @@ function handleTimeChange(orderId: number, startTime: any, order: OrderModel) {
 
 
   // 清空分配机构
   // 清空分配机构
   assignedInstitutionMap.value[orderId] = '';
   assignedInstitutionMap.value[orderId] = '';
+  assignedFromRightList.value[orderId] = false;
 
 
   // 刷新可派单机构列表
   // 刷新可派单机构列表
   loadInstitutionList();
   loadInstitutionList();
@@ -646,6 +656,8 @@ function handleLastInstitutionClick(orderId: number, institutionName: string) {
   }
   }
 
 
   assignedInstitutionMap.value[orderId] = institutionName;
   assignedInstitutionMap.value[orderId] = institutionName;
+  // 标记为已填充(可以显示按钮)
+  assignedFromRightList.value[orderId] = true;
 }
 }
 
 
 function handleSupplierClick(orderId: number, supplierName: string) {
 function handleSupplierClick(orderId: number, supplierName: string) {
@@ -662,6 +674,8 @@ function handleSupplierClick(orderId: number, supplierName: string) {
   }
   }
 
 
   assignedInstitutionMap.value[orderId] = supplierName;
   assignedInstitutionMap.value[orderId] = supplierName;
+  // 标记为已填充(可以显示按钮)
+  assignedFromRightList.value[orderId] = true;
 }
 }
 
 
 function handleAssignInstitution(institutionName: string) {
 function handleAssignInstitution(institutionName: string) {
@@ -680,8 +694,9 @@ function handleAssignInstitution(institutionName: string) {
       return;
       return;
     }
     }
 
 
-
     assignedInstitutionMap.value[selectedOrderId.value] = institutionName;
     assignedInstitutionMap.value[selectedOrderId.value] = institutionName;
+    // 标记为从右边列表选择
+    assignedFromRightList.value[selectedOrderId.value] = true;
   }
   }
 }
 }
 
 
@@ -831,6 +846,7 @@ async function handleConfirmAssign(orderId: number) {
 
 
     // 清空分配机构输入框
     // 清空分配机构输入框
     assignedInstitutionMap.value[orderId] = '';
     assignedInstitutionMap.value[orderId] = '';
+    assignedFromRightList.value[orderId] = false;
 
 
     // 静默更新订单计数(不显示loading,避免闪烁)
     // 静默更新订单计数(不显示loading,避免闪烁)
     loadOrderCounts().catch(err => {
     loadOrderCounts().catch(err => {
@@ -846,7 +862,9 @@ async function handleConfirmAssign(orderId: number) {
 
 
 // 处理取消
 // 处理取消
 function handleCancel(orderId: number) {
 function handleCancel(orderId: number) {
-  assignedInstitutionMap.value[orderId] = '';
+  // 只清空分配机构,保持按钮显示(不清空 assignedFromRightList)
+  // 使用 null 表示用户主动清空,这样在非 pending tab 中也不会显示原有的供应商名称
+  assignedInstitutionMap.value[orderId] = null as any;
 }
 }
 
 
 
 
@@ -861,6 +879,42 @@ function isOrderSelected(order: OrderModel): boolean {
   return result;
   return result;
 }
 }
 
 
+// 获取分配机构显示值
+function getAssignedInstitutionDisplayValue(order: OrderModel): string {
+  const orderId = getOrderId(order);
+  // 检查 key 是否存在(使用 hasOwnProperty 或 in 操作符)
+  const hasKey = orderId in assignedInstitutionMap.value;
+  const assignedValue = assignedInstitutionMap.value[orderId];
+  
+  
+  if (hasKey) {
+    if (assignedValue === null) {
+      return '';
+    }
+    return assignedValue || '';
+  }
+  
+  if (activeSubTab.value !== 'pending') {
+    return order.conditioningProgramSupplierName || '';
+  }
+  
+  return '';
+}
+
+// 判断是否应该显示确认指派按钮
+function shouldShowConfirmAssignButton(order: OrderModel): boolean {
+  // 如果订单已核销或已发货,不显示
+  if (isOrderVerified(order) || isOrderShipped(order)) {
+    return false;
+  }
+
+  const orderId = getOrderId(order);
+  // 检查是否已标记为可显示按钮(从右边列表选择、上次供应商或下面供应商填充)
+  // 只要标记为可显示,就显示按钮(即使后来点击取消清空了输入框)
+  const canShowButton = assignedFromRightList.value[orderId];
+  return canShowButton === true;
+}
+
 // 处理订单选中
 // 处理订单选中
 function handleOrderSelect(order: OrderModel) {
 function handleOrderSelect(order: OrderModel) {
   const orderId = getOrderId(order);
   const orderId = getOrderId(order);
@@ -1106,18 +1160,17 @@ defineExpose({
                 <div class="assign-section">
                 <div class="assign-section">
                   <span class="assign-label">分配机构:</span>
                   <span class="assign-label">分配机构:</span>
                   <a-input
                   <a-input
-                    :value="assignedInstitutionMap[getOrderId(order)] || (activeSubTab !== 'pending' ? (order.conditioningProgramSupplierName || '') : '')"
+                    :value="getAssignedInstitutionDisplayValue(order)"
                     placeholder="请点击右侧指派按钮或点击上次/供应商选择分配机构" class="assign-input" readonly
                     placeholder="请点击右侧指派按钮或点击上次/供应商选择分配机构" class="assign-input" readonly
                     :disabled="isOrderVerified(order) || isOrderShipped(order)" />
                     :disabled="isOrderVerified(order) || isOrderShipped(order)" />
-                  <!-- <a-button 
-                v-if="!isOrderVerified(order) && !isOrderShipped(order)" 
-                type="default" 
-                size="small" 
-                @click.stop="handleCancel(getOrderId(order))"
-              >
-                取消
-              </a-button> -->
-                  <a-button v-if="!isOrderVerified(order) && !isOrderShipped(order)" type="primary" size="small"
+                  <a-button 
+                    v-if="shouldShowConfirmAssignButton(order)" 
+                    type="default" 
+                    size="small" 
+                    @click.stop="handleCancel(getOrderId(order))">
+                    取消
+                  </a-button>
+                  <a-button v-if="shouldShowConfirmAssignButton(order)" type="primary" size="small"
                     @click.stop="handleConfirmAssign(getOrderId(order))">
                     @click.stop="handleConfirmAssign(getOrderId(order))">
                     确认指派
                     确认指派
                   </a-button>
                   </a-button>
@@ -1243,7 +1296,7 @@ defineExpose({
         flex-direction: column;
         flex-direction: column;
         overflow: hidden;
         overflow: hidden;
 
 
-     
+
         .order-list-header {
         .order-list-header {
           flex-shrink: 0;
           flex-shrink: 0;
           padding: 16px;
           padding: 16px;

+ 61 - 20
src/service/AddItems.vue

@@ -102,8 +102,6 @@ const form = reactive<any>({
 
 
 const checkedList = ref<string[]>(['1']); // 默认选中第一个
 const checkedList = ref<string[]>(['1']); // 默认选中第一个
 
 
-const deliverArr = ref<string[]>([]);
-
 // 建议频率相关字段
 // 建议频率相关字段
 const suggestedFrequencyUnit = ref<string>(''); // 建议频率单位
 const suggestedFrequencyUnit = ref<string>(''); // 建议频率单位
 
 
@@ -117,18 +115,32 @@ const rules: any = {
   offlineDuration: [{ required: true, message: '请输入服务所需时间', trigger: 'blur' }],
   offlineDuration: [{ required: true, message: '请输入服务所需时间', trigger: 'blur' }],
   institutionId: [
   institutionId: [
     {
     {
-      required: true,
-      message: '请选择机构名称',
       trigger: 'blur',
       trigger: 'blur',
       validator: async (_rule: any, value: any) => {
       validator: async (_rule: any, value: any) => {
         // 如果推导逻辑弹窗打开,跳过验证
         // 如果推导逻辑弹窗打开,跳过验证
         if (isDerivationModalOpen.value) return Promise.resolve();
         if (isDerivationModalOpen.value) return Promise.resolve();
-        if (!value) return Promise.reject(new Error('请选择机构名称'));
+        if (!value) return Promise.reject('请选择机构名称');
         return Promise.resolve();
         return Promise.resolve();
       },
       },
     },
     },
   ],
   ],
   photo: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
   photo: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
+  isDelivery: [
+    {
+      trigger: 'change',
+      validator: async (_rule: any, value: any) => {
+        // 如果只选择了调理方案项目(包含 '2' 但不包含 '1'),配送不必填
+        if (checkedList.value.includes('2') && !checkedList.value.includes('1')) {
+          return Promise.resolve();
+        }
+        // 项目应用含有服务包项目或商品类型是实体商品时,配送必填
+        if ((checkedList.value.includes('1') || form.sellType === '1') && !value) {
+          return Promise.reject('请选择配送方式');
+        }
+        return Promise.resolve();
+      },
+    },
+  ],
 };
 };
 const showMiniProgramCode = ref<boolean>(false);
 const showMiniProgramCode = ref<boolean>(false);
 const showBuyLink = ref<boolean>(false);
 const showBuyLink = ref<boolean>(false);
@@ -162,6 +174,16 @@ const showDelivery = computed(() => {
   return form.sellType === '1';
   return form.sellType === '1';
 });
 });
 
 
+// 判断配送是否必填(显示红色星号)
+const isDeliveryRequired = computed(() => {
+  // 如果只选择了调理方案项目,不必填
+  if (checkedList.value.includes('2') && !checkedList.value.includes('1')) {
+    return false;
+  }
+  // 项目应用含有服务包项目或商品类型是实体商品时,必填
+  return checkedList.value.includes('1') || form.sellType === '1';
+});
+
 // 线下服务:itemsList 和 system 类型都需要“服务所需时间”
 // 线下服务:itemsList 和 system 类型都需要“服务所需时间”
 const showServiceRequiredTime = computed(() => {
 const showServiceRequiredTime = computed(() => {
   return form.sellType === '2';
   return form.sellType === '2';
@@ -275,10 +297,10 @@ function doSubmit() {
       //   return;
       //   return;
       // }
       // }
       // 实体商品:配送必填(itemsList 和 system 类型都需要)
       // 实体商品:配送必填(itemsList 和 system 类型都需要)
-      if (form.sellType === '1' && (!deliverArr.value || deliverArr.value.length === 0)) {
-        message.error('请选择配送方式');
-        return;
-      }
+      // if (form.sellType === '1' && (!deliverArr.value || deliverArr.value.length === 0)) {
+      //   message.error('请选择配送方式');
+      //   return;
+      // }
     }
     }
   } else if (form.addType === 'itemsList') {
   } else if (form.addType === 'itemsList') {
     // 计价规则非必填时,做全填/全空校验
     // 计价规则非必填时,做全填/全空校验
@@ -773,12 +795,13 @@ watch(
   (newVal) => {
   (newVal) => {
     if (newVal === '1') {
     if (newVal === '1') {
       // 实体商品:默认支持配送(itemsList / system 都一样)
       // 实体商品:默认支持配送(itemsList / system 都一样)
-      form.isDelivery = 'Y';
-      deliverArr.value = ['Y'];
+      // 但如果只选择了调理方案项目,配送不是必填,不设置默认值,让用户自己选择
+      if (!(checkedList.value.includes('2') && !checkedList.value.includes('1'))) {
+        form.isDelivery = 'Y';
+      }
     } else {
     } else {
       // 其他类型:清空配送
       // 其他类型:清空配送
       form.isDelivery = null;
       form.isDelivery = null;
-      deliverArr.value = [];
     }
     }
   }
   }
 );
 );
@@ -790,15 +813,29 @@ watch(
     // 如果只选择了调理方案项目(包含 '2' 但不包含 '1'),自动设置为一口价
     // 如果只选择了调理方案项目(包含 '2' 但不包含 '1'),自动设置为一口价
     if (newVal.includes('2') && !newVal.includes('1')) {
     if (newVal.includes('2') && !newVal.includes('1')) {
       form.pricingType = '0';
       form.pricingType = '0';
+      // 如果只选择调理方案项目,配送不是必填,清空默认值让用户自己选择
+      if (form.sellType === '1') {
+        form.isDelivery = null;
+      }
+    } else if (form.sellType === '1' && !form.isDelivery) {
+      // 如果从只选择调理方案项目变为其他情况,且是实体商品,恢复默认值
+      form.isDelivery = 'Y';
     }
     }
   }
   }
 );
 );
-function deliveryChange(value: any) {
-  form.isDelivery = value[value.length - 1];
-}
 function getConditioningProgramSupplier() {
 function getConditioningProgramSupplier() {
   // 供应商改为可选,不做额外强制联动
   // 供应商改为可选,不做额外强制联动
 }
 }
+
+// 处理配送选项点击,允许取消选择
+function handleDeliveryClick(value: string) {
+  // 如果点击的是已选中的选项,则取消选择
+  if (form.isDelivery === value) {
+    form.isDelivery = null;
+  } else {
+    form.isDelivery = value;
+  }
+}
 // 项目应用数据
 // 项目应用数据
 const plainOptions = [
 const plainOptions = [
   { id: '1', name: '服务包项目' },
   { id: '1', name: '服务包项目' },
@@ -1157,11 +1194,15 @@ function handleDerivation() {
           :dropdownStyle="{ zIndex: 5000 }" style="width: 100%" @change="getConditioningProgramSupplier"
           :dropdownStyle="{ zIndex: 5000 }" style="width: 100%" @change="getConditioningProgramSupplier"
           not-found-content="暂无数据" />
           not-found-content="暂无数据" />
       </a-form-item>
       </a-form-item>
-      <a-form-item label="配送:" name="isDelivery" v-if="showDelivery" :required="form.sellType === '1'">
-        <a-checkbox-group v-model:value="deliverArr" @change="deliveryChange">
-          <a-checkbox value="Y">支持</a-checkbox>
-          <a-checkbox value="N">不支持</a-checkbox>
-        </a-checkbox-group>
+      <a-form-item  name="isDelivery" v-if="showDelivery">
+      
+         
+          <span> <span v-if="isDeliveryRequired" style="color: #ff4d4f">* </span>配送:</span>
+      
+        <a-radio-group :value="form.isDelivery">
+          <a-radio value="Y" @click="handleDeliveryClick('Y')">支持</a-radio>
+          <a-radio value="N" @click="handleDeliveryClick('N')">不支持</a-radio>
+        </a-radio-group>
       </a-form-item>
       </a-form-item>
       <a-form-item label="启用状态:" name="status" v-if="form.addType === 'itemsList'" required>
       <a-form-item label="启用状态:" name="status" v-if="form.addType === 'itemsList'" required>
         <a-radio-group v-model:value="form.status">
         <a-radio-group v-model:value="form.status">