cz před 1 rokem
rodič
revize
4f4dfa1590

+ 0 - 3
.gitmodules

@@ -1,3 +0,0 @@
-[submodule "erp_fans"]
-    path = erp_fans
-    url = http://36.137.93.232:3000/scz/erp_fans.git

+ 1 - 1
src/components/PDF/quotationPDF.vue

@@ -111,7 +111,7 @@ const getRowSpan = (productData, type) => {
 };
 const labelObj = {
   1: "原材料",
-  2: "包材辅材",
+  2: "包材/配件/辅材",
   3: "工序",
 };
 const getLabel = (type) => {

+ 12 - 1
src/components/byTable/index.vue

@@ -325,7 +325,18 @@ export default defineComponent({
     // configData.value = proxy.config.filter((x) => x && x.attrs);
     const configData = computed(() => proxy.config.filter((x) => x && x.attrs));
     const selectConfigCopy = computed(() => {
-      return props.selectConfig.map((item) => {
+      let list = props.selectConfig.filter((x) => {
+        if (x && x.label) {
+          if (x.label == "业务公司" && x.isFilter == undefined) {
+            return false;
+          } else {
+            return true;
+          }
+        } else {
+          return true;
+        }
+      });
+      return list.map((item) => {
         if (!item.labelCopy) item.labelCopy = { ...item }.label;
         return item;
       });

+ 46 - 0
src/components/headerBar/header-bar.vue

@@ -144,6 +144,10 @@
                   $t("header.personalCenter")
                 }}</el-dropdown-item>
               </router-link>
+              <el-dropdown-item divided v-for="company in useUserStore().user.companyList" :key="company.deptId"
+                                @click="changeCompany(company.deptId)">
+                <span :style="{color:company.deptId==useUserStore().user.companyId?'#409EFF':''}">{{company.deptName }}</span>
+              </el-dropdown-item>
               <!-- <el-dropdown-item command="setLayout">
                 <span>{{ $t("header.layoutSettings") }}</span>
               </el-dropdown-item> -->
@@ -637,6 +641,48 @@ function handleCommand(command) {
   }
 }
 
+function changeCompany(val) {
+  if (!val) {
+    return;
+  }
+  if (proxy.useUserStore().user.companyId == val) {
+    return;
+  }
+  proxy.useUserStore().setCurrentCompany(val);
+  proxy
+    .msgConfirm()
+    .then((res) => {
+      proxy
+        .post("/tenantUser/switchCompany", {
+          companyId: val,
+        })
+        .then((res) => {
+          proxy.msgTip("操作成功", 1);
+          setTimeout(() => {
+            window.location.reload();
+          }, 300);
+          // 更新业务公司数据
+          // proxy
+          //   .post("/tenantUser/getUserCompanyList", {
+          //     pageNum: 1,
+          //     pageSize: 9999,
+          //   })
+          //   .then((res) => {
+          //     proxy.useUserStore().allDict["list_company_data"] = res.map(
+          //       (x) => ({
+          //         ...x,
+          //         label: x.deptName,
+          //         value: x.deptId,
+          //       })
+          //     );
+          //     proxy.useUserStore().allDict["tree_company_data"] =
+          //       proxy.handleTree(res, "deptId");
+          //   });
+        });
+    })
+    .catch((err) => {});
+}
+
 function logout() {
   ElMessageBox.confirm(
     proxy.t("header.areYouSureYouWantToLogOutAndExitTheSystem"),

+ 2 - 2
src/components/process/EHSD/Contract.vue

@@ -377,11 +377,11 @@ const formConfig = computed(() => {
       data: [
         {
           dictKey: "0",
-          dictValue: "常规订单",
+          dictValue: "内销订单",
         },
         {
           dictKey: "1",
-          dictValue: "出口退税订单",
+          dictValue: "外贸订单(退税)",
         },
       ],
       fn: (val) => {

+ 72 - 9
src/components/process/SF/Contract.vue

@@ -8,6 +8,31 @@
             " @click="clickCopy(1)">复制合同</el-button>
         </div>
       </template>
+
+      <template #ofCompanyId>
+        <div style="width: 100%">
+          <el-form-item label="业务公司" class="margin-b-0 wid100" required>
+            <el-row style="width: 100%">
+              <el-col :span="12">
+                <el-form-item prop="ofCompanyId" label="" label-width="0px" class="margin-b-0 wid100">
+                  <el-tree-select v-model="formData.data.ofCompanyId" :data="useUserStore().allDict['tree_company_data']" style="width: 100%"
+                                  placeholder="公司" default-expand-all
+                                  :props="{ value:  'deptId', label:  'deptName', children: 'children', disabled: 'disabled' }"
+                                  @change="handleOfCompanyIdChange" :disabled="useUserStore().currentCompany==useUserStore().user.companyId" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item prop="deptId" label="" label-width="0px" class="margin-b-0 wid100">
+                  <el-tree-select v-model="formData.data.deptId" :data="deptData" style="width: 100%" placeholder="部门" default-expand-all
+                                  :props="{ value:  'deptId', label:  'deptName', children: 'children', disabled: 'disabled' }" />
+                </el-form-item>
+              </el-col>
+
+            </el-row>
+          </el-form-item>
+        </div>
+      </template>
+
       <template #seller>
         <div style="width: 100%">
           <el-form-item prop="sellCorporationId" label="卖方信息" class="wid100">
@@ -349,7 +374,7 @@
             </el-table-column>
             <el-table-column label="操作" width="140" align="center" fixed="right" v-if="!judgeStatus() && isEditList">
               <template #default="{ $index }">
-                <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材辅材</el-button>
+                <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材/配件/辅材</el-button>
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
               </template>
             </el-table-column>
@@ -468,6 +493,7 @@ const countryData = ref([]);
 const provinceData = ref([]);
 const cityData = ref([]);
 const treeData = ref([]);
+const deptData = ref([]);
 const openProductCompany = ref(false);
 const copyType = ref(1);
 const copyContract = ref(false);
@@ -529,13 +555,19 @@ const formConfig = computed(() => {
       disabled: true,
       isShow: formData.data.code ? true : false,
     },
+    // {
+    //   type: "treeSelect",
+    //   prop: "ofCompanyId",
+    //   label: "业务公司",
+    //   data: proxy.useUserStore().allDict["tree_company_data"],
+    //   propsTreeLabel: "deptName",
+    //   propsTreeValue: "deptId",
+    //   itemWidth: 50,
+    // },
     {
-      type: "treeSelect",
-      prop: "ofCompanyId",
-      label: "业务公司",
-      data: proxy.useUserStore().allDict["tree_company_data"],
-      propsTreeLabel: "deptName",
-      propsTreeValue: "deptId",
+      type: "slot",
+      slotName: "ofCompanyId",
+      label: "",
       itemWidth: 50,
     },
     {
@@ -549,11 +581,15 @@ const formConfig = computed(() => {
         },
         {
           dictKey: "2",
-          dictValue: "常规订单",
+          dictValue: "内销订单",
         },
         {
           dictKey: "1",
-          dictValue: "出口退税订单",
+          dictValue: "外贸订单(退税)",
+        },
+        {
+          dictKey: "4",
+          dictValue: "外贸订单(不退税)",
         },
       ],
       itemWidth: 50,
@@ -881,6 +917,7 @@ const rules = ref({
   ofCompanyId: [
     { required: true, message: "请选择业务公司", trigger: "change" },
   ],
+  deptId: [{ required: true, message: "请选择业务部门", trigger: "change" }],
   companyId: [{ required: true, message: "请选择生产公司", trigger: "change" }],
   contractType: [
     { required: true, message: "请选择订单类型", trigger: "change" },
@@ -1039,6 +1076,23 @@ const getCityData = (id, type, isChange) => {
 getDict();
 getCityData("0");
 
+const handleOfCompanyIdChange = (val) => {
+  if (val) {
+    proxy
+      .get("/tenantDept/list", {
+        pageNum: 1,
+        pageSize: 9999,
+        keyword: "",
+        parentId: val,
+        tenantId: proxy.useUserStore().user.tenantId,
+        type: 2,
+      })
+      .then((res) => {
+        deptData.value = proxy.handleTree(res.data, "deptId");
+      });
+  }
+};
+
 const sellCorporationIdChange = (val) => {
   if (val) {
     proxy.post("/corporation/detail", { id: val }).then((res) => {
@@ -1842,6 +1896,15 @@ const getPriceSheetData = (id) => {
 // 是否能编辑修改产品列表
 const isEditList = ref(true);
 onMounted(() => {
+  if (
+    proxy.useUserStore().currentCompany == proxy.useUserStore().user.companyId
+  ) {
+    formData.data.ofCompanyId = proxy.useUserStore().user.companyId;
+    handleOfCompanyIdChange(formData.data.ofCompanyId);
+    // setTimeout(() => {
+    //   formData.data.deptId = proxy.useUserStore().user.deptId;
+    // }, 1500);
+  }
   if (currencyData.value && currencyData.value.length > 0) {
     formData.data.currency = currencyData.value[0].dictKey;
   }

+ 7 - 3
src/components/process/SF/ContractChange.vue

@@ -349,7 +349,7 @@
             </el-table-column>
             <el-table-column label="操作" width="140" align="center" fixed="right" v-if="!judgeStatus() && isEditList">
               <template #default="{ $index }">
-                <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材辅材</el-button>
+                <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材/配件/辅材</el-button>
                 <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
               </template>
             </el-table-column>
@@ -549,11 +549,15 @@ const formConfig = computed(() => {
         },
         {
           dictKey: "2",
-          dictValue: "常规订单",
+          dictValue: "内销订单",
         },
         {
           dictKey: "1",
-          dictValue: "出口退税订单",
+          dictValue: "外贸订单(退税)",
+        },
+        {
+          dictKey: "4",
+          dictValue: "外贸订单(不退税)",
         },
       ],
       itemWidth: 50,

+ 2 - 2
src/components/process/SF/PriceSheet.vue

@@ -368,11 +368,11 @@ const formConfig = computed(() => {
       data: [
         {
           dictKey: "2",
-          dictValue: "常规订单",
+          dictValue: "内销订单",
         },
         {
           dictKey: "1",
-          dictValue: "出口退税订单",
+          dictValue: "外贸订单(退税)",
         },
       ],
       itemWidth: 50,

+ 6 - 0
src/store/modules/user.js

@@ -21,6 +21,7 @@ const useUserStore = defineStore(
       permissions: [],
       user: {},
       allDict: {},
+      currentCompany: ""
     }),
     actions: {
       // 登录
@@ -55,6 +56,7 @@ const useUserStore = defineStore(
             }
             this.name = user.userName
             this.user = user
+            this.currentCompany = user.companyId
             this.avatar = avatar;
             resolve(res)
           }).catch(error => {
@@ -75,6 +77,10 @@ const useUserStore = defineStore(
             });
         });
       },
+      // 当前的公司
+      setCurrentCompany(val) {
+        this.currentCompany = val
+      },
       // 退出系统
       logOut() {
         return new Promise((resolve, reject) => {

+ 425 - 59
src/views/EHSD/productLibrary/companyProduct/index.vue

@@ -67,6 +67,25 @@
               <el-button type="primary" plain @click="handleClickUpload('prodImgPath',false)" v-else>点击查看</el-button>
             </div>
           </template>
+
+          <template #color>
+            <div style="width: 100%">
+              <el-form-item label="颜色" class="margin-b-0 wid100">
+                <el-row style="width: 100%">
+                  <el-col :span="12">
+                    <el-form-item prop="color" label-width="0px" class="margin-b-0 wid100">
+                      <el-input v-model="formData.data.color" placeholder="颜色" />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item prop="colorCardCode" label-width="0px" class="margin-b-0 wid100">
+                      <el-input v-model="formData.data.colorCardCode" placeholder="色卡号" />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-form-item>
+            </div>
+          </template>
           <template #size>
             <div style="width: 100%">
               <el-form-item label="尺寸" class="margin-b-0 wid100" required>
@@ -74,19 +93,19 @@
                   <el-col :span="8">
                     <el-form-item prop="length" label-width="0px" class="margin-b-0 wid100">
                       <el-input-number v-model="formData.data['length']" placeholder="长 (cm)" style="width: 100%" :precision="2" :controls="false"
-                                       :min="0" onmousewheel="return false;" @change="getPriceData" />
+                                       :min="0" onmousewheel="return false;" />
                     </el-form-item>
                   </el-col>
                   <el-col :span="8">
                     <el-form-item prop="width" label-width="0px" class="margin-b-0 wid100">
                       <el-input-number v-model="formData.data.width" placeholder="宽 (cm)" style="width: 100%" :precision="2" :controls="false"
-                                       :min="0" onmousewheel="return false;" @change="getPriceData" />
+                                       :min="0" onmousewheel="return false;" />
                     </el-form-item>
                   </el-col>
                   <el-col :span="8">
                     <el-form-item prop="height" label-width="0px" class="margin-b-0 wid100">
                       <el-input-number v-model="formData.data.height" placeholder="高 (cm)" style="width: 100%" :precision="2" :controls="false"
-                                       :min="0" onmousewheel="return false;" @change="getPriceData" />
+                                       :min="0" onmousewheel="return false;" />
                     </el-form-item>
                   </el-col>
                 </el-row>
@@ -94,6 +113,161 @@
 
             </div>
           </template>
+
+          <template #materialDetail>
+            <div style="width: 100%;padding-left:15px">
+              <el-button type="primary" @click="clickOpenSelectMaterial(1)" plain>选择包材/配件/辅材</el-button>
+              <el-table :data="formData.data.productBomDetailList" style="width: 100%; margin-top: 16px">
+                <el-table-column prop="materialName" label="物料名称" min-width="130" />
+                <el-table-column prop="materialCode" label="物料编码" width="150" />
+                <el-table-column label="数量" width="150">
+                  <template #default="{ row, $index }">
+                    <div style="width: 100%">
+                      <el-form-item :prop="'productBomDetailList.' + $index + '.quantity'" :rules="rules.quantity" :inline-message="true"
+                                    class="margin-b-0 wid100">
+                        <el-input-number onmousewheel="return false;" v-model="row.quantity" placeholder="请输入" style="width: 100%" :precision="0"
+                                         :controls="false" :min="1" />
+                      </el-form-item>
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作" width="60" align="center" fixed="right">
+                  <template #default="{ $index }">
+                    <el-button type="primary" link @click="handleRemove($index,1)">删除</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </template>
+
+          <template #technology>
+            <div style="width:100%">
+              <div class="small-title">
+                ① 工艺线路
+              </div>
+              <el-row style="width:100%">
+                <el-col :span="12">
+                  <el-form-item prop="technologyId" label="工艺产线" class="wid100">
+                    <el-select v-model="formData.data.technologyId" placeholder="请选择" style="width:100%">
+                      <el-option v-for="item in technologyData" :key="item.id" :label="item.name" :value="item.id" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <div class="small-title">
+                ② LOGO
+              </div>
+              <el-row style="width:100%">
+                <el-col :span="12">
+                  <el-form-item label="LOGO尺寸" class="wid100">
+                    <el-row>
+                      <el-col :span="8">
+                        <el-form-item prop="logoLength" label-width="0px" class="margin-b-0 wid100">
+                          <el-input-number v-model="formData.data.logoLength" placeholder="长 (cm)" style="width: 100%" :precision="2"
+                                           :controls="false" :min="0" onmousewheel="return false;" />
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="8">
+                        <el-form-item prop="logoWidth" label-width="0px" class="margin-b-0 wid100">
+                          <el-input-number v-model="formData.data.logoWidth" placeholder="宽 (cm)" style="width: 100%" :precision="2" :controls="false"
+                                           :min="0" onmousewheel="return false;" />
+                        </el-form-item>
+                      </el-col>
+                      <el-col :span="8">
+                        <el-form-item prop="logoHeight" label-width="0px" class="margin-b-0 wid100">
+                          <el-input-number v-model="formData.data.logoHeight" placeholder="高 (cm)" style="width: 100%" :precision="2"
+                                           :controls="false" :min="0" onmousewheel="return false;" />
+                        </el-form-item>
+                      </el-col>
+                    </el-row>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item prop="colorCount" label="几色印刷" class="wid100">
+                    <el-input-number v-model="formData.data.colorCount" placeholder="请输入" style="width: 100%" :precision="0" :controls="false"
+                                     :min="1" onmousewheel="return false;" />
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <div class="small-title">
+                ③ 折叠
+              </div>
+              <el-row style="width:100%">
+                <el-col :span="12">
+                  <el-form-item prop="isFold" label="是否折叠" class="wid100">
+                    <el-select v-model="formData.data.isFold" placeholder="请选择" style="width:100%">
+                      <el-option :label="'否'" :value="0" />
+                      <el-option :label="'是'" :value="1" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item prop="foldWay" label="折叠数" class="wid100" v-if="formData.data.isFold==1">
+                    <el-select v-model="formData.data.foldWay" placeholder="请选择" style="width:100%">
+                      <el-option v-for="item in foldWayData" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <div class="small-title">
+                ④ 包装要求
+              </div>
+              <el-row style="width:100%">
+                <el-col :span="12">
+                  <el-form-item prop="packAsk" label="包装要求" class="wid100">
+                    <el-select v-model="formData.data.packAsk" placeholder="请选择" style="width:100%" multiple>
+                      <el-option v-for="item in packAskData" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <div class="small-title">
+                ⑤ 是否定制
+              </div>
+              <el-row style="width:100%">
+                <el-col :span="12">
+                  <el-form-item prop="isCustomized" label="是否定制" class="wid100">
+                    <el-select v-model="formData.data.isCustomized" placeholder="请选择" style="width:100%">
+                      <el-option :label="'否'" :value="0" />
+                      <el-option :label="'是'" :value="1" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row style="width:100%">
+                <el-form-item prop="technologyId" label="定制内容" class="wid100" v-if="formData.data.isCustomized==1">
+                  <table style="width:100%" border class="table">
+                    <tr>
+                      <td style="width:20%">
+                      </td>
+                      <td style="width:40%">附件</td>
+                      <td style="width:40%">备注</td>
+                    </tr>
+                    <tr v-for="(row,index) in formData.data.productCustomInfoList" :key="index">
+                      <td>
+                        <el-checkbox v-model="row.isCheckBox" label="" /> <span style="position:relative;top:-2px"> {{getLabel(row.type)}}</span>
+                      </td>
+                      <td>
+                        <el-upload :file-list="row.fileList" :action="uploadUrl" :data="uploadData" :limit="1" :list-type="'text'"
+                                   :before-upload="(file)=>handleBeforeUploadOne(file,index)" :on-success="()=>handleSuccessOne(index)"
+                                   :on-remove="(file)=>handleRemoveFile(file,index)" :on-preview="onPreviewFile"
+                                   :on-exceed="()=>msgTip(`上传文件数量不可大于1`, 2)">
+                          <el-button text type="primary">上传附件</el-button>
+                        </el-upload>
+                      </td>
+                      <td>
+                        <el-form-item :prop="'productCustomInfoList.' + index + '.remark'" :rules="row.isCheckBox?rules.remark:''"
+                                      class="margin-b-0 wid100">
+                          <el-input v-model="row.remark" placeholder="请输入备注" />
+                        </el-form-item>
+                      </td>
+                    </tr>
+                  </table>
+                </el-form-item>
+              </el-row>
+            </div>
+          </template>
+
         </byForm>
       </div>
       <template #footer>
@@ -125,7 +299,7 @@
               </el-table-column>
               <el-table-column label="操作" width="60" align="center" fixed="right">
                 <template #default="{ $index }">
-                  <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
+                  <el-button type="primary" link @click="handleRemove($index,1)">删除</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -159,10 +333,10 @@
                 </tr>
                 <tr>
                   <td>
-                    包材辅材
+                    包材/配件/辅材
                   </td>
                   <td style="padding:20px 20px 20px">
-                    <div style="text-align:left"><el-button type="primary" @click="openSelectMaterial = true" plain>选择</el-button></div>
+                    <div style="text-align:left"><el-button type="primary" @click="clickOpenSelectMaterial(2)" plain>选择</el-button></div>
                     <el-table :data="formData.bomData.productBomDetailList" style="width: 100%;">
                       <el-table-column prop="materialName" label="物料名称" min-width="130" />
                       <el-table-column prop="materialCode" label="物料编码" width="150" />
@@ -179,7 +353,7 @@
                       </el-table-column>
                       <el-table-column label="操作" width="60" align="center" fixed="right">
                         <template #default="{ $index }">
-                          <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
+                          <el-button type="primary" link @click="handleRemove($index,2)">删除</el-button>
                         </template>
                       </el-table-column>
                     </el-table>
@@ -252,7 +426,11 @@ const companyData = ref([]);
 const currencyData = computed(
   () => proxy.useUserStore().allDict["account_currency"]
 );
+const packAskData = computed(() => proxy.useUserStore().allDict["pack_ask"]);
+const foldWayData = computed(() => proxy.useUserStore().allDict["fold_way"]);
+
 const headers = ref({ Authorization: "Bearer " + getToken() });
+const uploadData = ref({});
 const tableHeight = ref(0);
 const getTableHeight = () => {
   tableHeight.value = window.innerHeight - 245;
@@ -294,6 +472,8 @@ const rules = ref({
   rawMaterialId: [
     { required: true, message: "请选择原材料", trigger: "change" },
   ],
+  quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
+  remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
 });
 const props = defineProps({
   selectStatus: Boolean,
@@ -561,6 +741,16 @@ const formConfig = computed(() => {
       disabled: false,
     },
     {
+      type: "number",
+      prop: "price",
+      label: "销售价",
+      precision: 2,
+      min: 0.01,
+      controls: false,
+      itemWidth: 50,
+      disabled: false,
+    },
+    {
       type: "uploadImg",
       // listType: "picture-card",
       // limit: 1,
@@ -568,6 +758,14 @@ const formConfig = computed(() => {
       prop: "fileList",
       imgProp: "imageUrl",
       label: "产品缩略图",
+      itemWidth: 50,
+    },
+    {
+      type: "input",
+      prop: "hsCode",
+      label: "海关编码",
+      itemWidth: 50,
+      disabled: false,
     },
     {
       type: "slot",
@@ -591,7 +789,7 @@ const formConfig = computed(() => {
     // },
     {
       type: "title1",
-      title: "属性信息",
+      title: "主材",
     },
     {
       type: "select",
@@ -610,19 +808,10 @@ const formConfig = computed(() => {
         //     ).toFixed(2)
         //   );
         // }
-        getPriceData();
+        // getPriceData();
       },
     },
-    {
-      type: "number",
-      prop: "price",
-      label: "销售价",
-      precision: 2,
-      min: 0.01,
-      controls: false,
-      itemWidth: 50,
-      disabled: true,
-    },
+
     // {
     //   type: "selectInput",
     //   prop: "price",
@@ -633,18 +822,18 @@ const formConfig = computed(() => {
     //   data: currencyData.value,
     //   disabled: true,
     // },
-    {
-      type: "select",
-      prop: "technologyId",
-      label: "生产工艺",
-      itemWidth: 50,
-      data: technologyData.value,
-      filterable: true,
-      disabled: false,
-      fn: () => {
-        getPriceData();
-      },
-    },
+    // {
+    //   type: "select",
+    //   prop: "technologyId",
+    //   label: "生产工艺",
+    //   itemWidth: 50,
+    //   data: technologyData.value,
+    //   filterable: true,
+    //   disabled: false,
+    //   fn: () => {
+    //     // getPriceData();
+    //   },
+    // },
     // {
     //   type: "input",
     //   prop: "spec",
@@ -653,9 +842,10 @@ const formConfig = computed(() => {
     //   disabled: false,
     // },
     {
-      type: "input",
-      prop: "color",
-      label: "颜色",
+      type: "slot",
+      slotName: "color",
+      prop: "",
+      label: "",
       itemWidth: 50,
       disabled: false,
     },
@@ -706,19 +896,28 @@ const formConfig = computed(() => {
       controls: false,
       itemWidth: 50,
     },
+    // {
+    //   type: "input",
+    //   itemType: "textarea",
+    //   prop: "remark",
+    //   label: "备注",
+    //   itemWidth: 100,
+    // },
     {
-      type: "input",
-      prop: "hsCode",
-      label: "海关编码",
-      itemWidth: 50,
-      disabled: false,
+      type: "title1",
+      title: "辅材",
     },
     {
-      type: "input",
-      itemType: "textarea",
-      prop: "remark",
-      label: "备注",
-      itemWidth: 100,
+      type: "slot",
+      slotName: "materialDetail",
+    },
+    {
+      type: "title1",
+      title: "附加工艺要求",
+    },
+    {
+      type: "slot",
+      slotName: "technology",
     },
   ];
 });
@@ -800,6 +999,33 @@ const openModal = () => {
     fileList: [],
     currency: "",
     prodFileList: [],
+    isFold: 0,
+    isCustomized: 0,
+    packAsk: [],
+    productBomDetailList: [],
+    productCustomInfoList: [
+      {
+        type: 1,
+        isCheck: 0,
+        isCheckBox: false,
+        fileList: [],
+        remark: "",
+      },
+      {
+        type: 2,
+        isCheck: 0,
+        isCheckBox: false,
+        fileList: [],
+        remark: "",
+      },
+      {
+        type: 3,
+        isCheck: 0,
+        isCheckBox: false,
+        fileList: [],
+        remark: "",
+      },
+    ],
   };
   // if (currencyData.value && currencyData.value.length > 0) {
   //   formData.data.currency = currencyData.value[0].dictKey;
@@ -815,11 +1041,27 @@ const submitForm = () => {
     if (!formData.data.fileList.length > 0) {
       return proxy.msgTip("请上传图片", 2);
     }
+    // if(!formData.data.productBomDetailList.length>0){
+
+    // }
     // formData.data.fileList = formData.data.fileList.map((x) => ({
     //   id: x.id,
     //   fileName: x.fileName,
     //   fileUrl: x.fileUrl,
     // }));
+    for (let i = 0; i < formData.data.productCustomInfoList.length; i++) {
+      const ele = formData.data.productCustomInfoList[i];
+      ele.isCheck = ele.isCheckBox ? 1 : 0;
+      if (ele.isCheckBox) {
+        if (!(ele.fileList && ele.fileList.length > 0)) {
+          return proxy.msgTip(`请上传${getLabel(ele.type)}附件`, 2);
+        }
+      }
+    }
+
+    if (formData.data.packAsk && formData.data.packAsk.length > 0) {
+      formData.data.packAsk = formData.data.packAsk.join(",");
+    }
     submitLoading.value = true;
     proxy.post("/productInfo/" + modalType.value, formData.data).then(
       (res) => {
@@ -830,6 +1072,9 @@ const submitForm = () => {
       },
       (err) => {
         submitLoading.value = false;
+        if (formData.data.packAsk) {
+          formData.data.packAsk = formData.data.packAsk.split(",");
+        }
       }
     );
   });
@@ -858,6 +1103,39 @@ const getDtl = (row) => {
   modalType.value = "edit";
   proxy.post("/productInfo/detail", { id: row.id }).then((res) => {
     formData.data = res;
+    formData.data.productBomDetailList =
+      formData.data.productBomDetailList.filter((x) => x.type == 2);
+
+    if (
+      formData.data.productCustomInfoList &&
+      formData.data.productCustomInfoList.length > 0
+    ) {
+      // let productCustomInfoIds = formData.data.productCustomInfoList.map(
+      //   (x) => x.id
+      // );
+      // proxy.getFileData({
+      //   businessIdList: productCustomInfoIds,
+      //   data: formData.data.productCustomInfoList,
+      //   att: "id",
+      //   businessType: "0",
+      //   fileAtt: "fileList",
+      // });
+      formData.data.productCustomInfoList.forEach((x) => {
+        x.isCheckBox = x.isCheck == 1;
+        if (!x.fileList) {
+          x.fileList = [];
+        } else {
+          x.fileList = x.fileList.map((x) => ({
+            ...x,
+            url: x.fileUrl,
+            name: x.fileName,
+          }));
+        }
+      });
+    }
+    if (formData.data.packAsk) {
+      formData.data.packAsk = formData.data.packAsk.split(",");
+    }
     formData.data.fileList = row.fileList.map((x) => ({
       ...x,
       url: x.fileUrl,
@@ -866,6 +1144,7 @@ const getDtl = (row) => {
     if (formData.data.fileList.length > 0) {
       formData.data.imageUrl = formData.data.fileList[0].fileUrl;
     }
+
     proxy
       .post("/fileInfo/getList", { businessIdList: [row.id] })
       .then((fileObj) => {
@@ -997,25 +1276,52 @@ const submitBomForm = () => {
   });
 };
 const openSelectMaterial = ref(false);
+const openType = ref(-1);
+const clickOpenSelectMaterial = (type) => {
+  openType.value = type;
+  openSelectMaterial.value = true;
+};
 const selectMaterial = (row) => {
-  let flag = formData.bomData.productBomDetailList.some(
-    (x) => x.materialId == row.id
-  );
-  if (!flag) {
-    formData.bomData.productBomDetailList.push({
-      type: 2,
-      materialName: row.name,
-      materialCode: row.customCode,
-      materialId: row.id,
-      quantity: null,
-    });
-    proxy.msgTip("选择成功");
+  if (openType.value == 1) {
+    let flag = formData.data.productBomDetailList.some(
+      (x) => x.materialId == row.id
+    );
+    if (!flag) {
+      formData.data.productBomDetailList.push({
+        type: 2,
+        materialName: row.name,
+        materialCode: row.customCode,
+        materialId: row.id,
+        quantity: null,
+      });
+      proxy.msgTip("选择成功");
+    } else {
+      proxy.msgTip("该物料已选择", 2);
+    }
   } else {
-    proxy.msgTip("该物料已选择", 2);
+    let flag = formData.bomData.productBomDetailList.some(
+      (x) => x.materialId == row.id
+    );
+    if (!flag) {
+      formData.bomData.productBomDetailList.push({
+        type: 2,
+        materialName: row.name,
+        materialCode: row.customCode,
+        materialId: row.id,
+        quantity: null,
+      });
+      proxy.msgTip("选择成功");
+    } else {
+      proxy.msgTip("该物料已选择", 2);
+    }
   }
 };
-const handleRemove = (index) => {
-  formData.bomData.productBomDetailList.splice(index, 1);
+const handleRemove = (index, type) => {
+  if (type == 1) {
+    formData.data.productBomDetailList.splice(index, 1);
+  } else {
+    formData.bomData.productBomDetailList.splice(index, 1);
+  }
 };
 
 const handleClickFile = (file) => {
@@ -1076,6 +1382,57 @@ const exportExcel = () => {
       proxy.downloadFile(res, "产品数据.xlsx");
     });
 };
+
+const handleBeforeUploadOne = async (file, index) => {
+  const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
+  file.id = res.id;
+  file.fileUrl = res.fileUrl;
+  uploadData.value = res.uploadBody;
+  formData.data.productCustomInfoList[index].fileData = res;
+  return true;
+};
+
+const handleSuccessOne = (index) => {
+  if (
+    formData.data.productCustomInfoList[index].fileData &&
+    formData.data.productCustomInfoList[index].fileData.fileUrl
+  ) {
+    let file = formData.data.productCustomInfoList[index].fileData;
+    formData.data.productCustomInfoList[index].fileList.push({
+      id: file.id,
+      fileName: file.fileName,
+      name: file.fileName,
+      url: file.fileUrl,
+      fileUrl: file.fileUrl,
+    });
+    formData.data.productCustomInfoList[index].fileData = {};
+  }
+};
+
+const handleRemoveFile = (file, index) => {
+  let sonIndex = formData.data.productCustomInfoList[index].fileList.findIndex(
+    (x) => x.id == file.id || x.id == file.raw.id
+  );
+  if (sonIndex > -1) {
+    formData.data.productCustomInfoList[index].fileList.splice(sonIndex, 1);
+  }
+};
+
+const onPreviewFile = (file) => {
+  if (file && file.fileUrl) {
+    window.open(file.fileUrl, "_blank");
+  } else {
+    window.open(file.raw.fileUrl, "_blank");
+  }
+};
+let obj = {
+  1: "定制刀模",
+  2: "定制纹路",
+  3: "定制模具",
+};
+const getLabel = (type) => {
+  return obj[type];
+};
 </script>
 
 <style lang="scss" scoped>
@@ -1107,4 +1464,13 @@ const exportExcel = () => {
     // padding: 5px 10px;
   }
 }
+.small-title {
+  padding-left: 15px;
+  margin-bottom: 10px;
+  color: #3366ff;
+  font-size: 14px;
+}
+:deep(.el-checkbox) {
+  margin-right: 0px;
+}
 </style>

+ 2 - 2
src/views/EHSD/saleContract/PriceSheetDetail.vue

@@ -188,11 +188,11 @@ const props = defineProps({
 });
 const typeData = ref([
   {
-    label: "常规订单",
+    label: "内销订单",
     value: 1,
   },
   {
-    label: "出口退税订单",
+    label: "外贸订单(退税)",
     value: 2,
   },
 ]);

+ 66 - 38
src/views/EHSD/saleContract/businessReport/index.vue

@@ -11,6 +11,12 @@
         </div>
       </template>
 
+      <template #outInterval="{item}">
+        <div style="width:100%">
+          <span :style="{color:item.outInterval>=30?'red':''}">{{item.outInterval}}</span>
+        </div>
+      </template>
+
     </byTable>
 
   </div>
@@ -40,65 +46,89 @@ const sourceList = ref({
     pageNum: 1,
     pageSize: 10,
     keyword: "",
-    status: "",
-    payStatus: "",
   },
 });
 const loading = ref(false);
 const selectConfig = computed(() => {
   return [];
 });
+const contractType = ref([
+  {
+    dictKey: "3",
+    dictValue: "打样订单",
+  },
+  {
+    dictKey: "2",
+    dictValue: "内销订单",
+  },
+  {
+    dictKey: "1",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
+  },
+]);
 const config = computed(() => {
   return [
     {
       attrs: {
         label: "订单类型",
-        prop: "a",
+        prop: "contractType",
         width: 130,
       },
+      render(val) {
+        return proxy.dictKeyValue(val, contractType.value);
+      },
     },
     {
       attrs: {
         label: "订单号",
         prop: "code",
-        width: 180,
+        "min-width": 150,
       },
     },
 
     {
       attrs: {
         label: "业务公司",
-        prop: "b",
-        width: 140,
+        prop: "ofCompanyName",
+        width: 110,
       },
     },
     {
       attrs: {
         label: "业务部门",
-        prop: "c",
-        width: 140,
+        prop: "deptName",
+        width: 110,
       },
     },
     {
       attrs: {
         label: "工厂",
-        prop: "userName",
-        width: 140,
+        prop: "companyName",
+        width: 110,
       },
     },
     {
       attrs: {
         label: "订单归属",
-        prop: "d",
-        width: 140,
+        prop: "belongType",
+        width: 80,
+      },
+      render(val) {
+        return val == 1 ? "工厂" : "业务";
       },
     },
-
     {
       attrs: {
         label: "订单金额",
         prop: "amount",
-        width: 140,
+        width: 110,
+      },
+      render(val) {
+        return proxy.moneyFormat(val, 2);
       },
     },
     {
@@ -111,14 +141,20 @@ const config = computed(() => {
     {
       attrs: {
         label: "交期",
-        prop: "e",
-        width: 140,
+        prop: "deliveryTime",
+        width: 100,
+      },
+      render(val) {
+        if (val) {
+          return val.slice(0, 10);
+        }
+        return "";
       },
     },
     {
       attrs: {
         label: "完工入库时间",
-        prop: "createTime",
+        prop: "finishTime",
         width: 160,
       },
     },
@@ -126,25 +162,28 @@ const config = computed(() => {
     {
       attrs: {
         label: "出货时间",
-        prop: "f",
-
+        prop: "outboundTime",
         width: 140,
       },
     },
     {
       attrs: {
+        slot: "outInterval",
         label: "出货间隔时间",
-        prop: "g",
-
-        width: 140,
+        // prop: "outInterval",
+        width: 110,
       },
     },
     {
       attrs: {
         label: "出货不及时率",
-        prop: "h",
-
-        width: 140,
+        prop: "untimelyRate",
+        width: 110,
+      },
+      render(val) {
+        if (val) {
+          return val + " %";
+        }
       },
     },
   ];
@@ -153,19 +192,8 @@ const config = computed(() => {
 const getList = async (req) => {
   sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
   loading.value = true;
-  proxy.post("/ehsdPurchase/page", sourceList.value.pagination).then((res) => {
-    console.log(res);
-    sourceList.value.data = res.rows.map((x) => ({
-      ...x,
-      a: "常规订单",
-      b: "三梵实业",
-      c: "业务部",
-      d: "三梵体育",
-      e: "2024-02-15",
-      f: "2024-02-14",
-      g: "10",
-      h: "10%",
-    }));
+  proxy.post("/report/saleReport", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
     sourceList.value.pagination.total = res.total;
     setTimeout(() => {
       loading.value = false;

+ 13 - 2
src/views/EHSD/saleContract/contractEHSD/index.vue

@@ -373,11 +373,15 @@ const contractType = ref([
   },
   {
     dictKey: "2",
-    dictValue: "常规订单",
+    dictValue: "内销订单",
   },
   {
     dictKey: "1",
-    dictValue: "出口退税订单",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
   },
 ]);
 
@@ -523,6 +527,13 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "业务部门",
+        prop: "deptName",
+        width: 110,
+      },
+    },
+    {
+      attrs: {
         label: "订单类型",
         slot: "contractType",
         width: 110,

+ 2 - 2
src/views/EHSD/saleContract/priceSheetEHSD/index.vue

@@ -276,7 +276,7 @@
               </el-table-column>
               <el-table-column label="操作" width="140" align="center" fixed="right" v-if="!isDetail">
                 <template #default="{ $index }">
-                  <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材辅材</el-button>
+                  <el-button type="primary" link @click="handleClickSelectMaterial($index)">包材/配件/辅材</el-button>
                   <el-button type="primary" link @click="handleRemove($index)">删除</el-button>
                 </template>
               </el-table-column>
@@ -634,7 +634,7 @@ const quotationStatusData = ref([
 ]);
 const typeData = ref([
   {
-    label: "常规订单",
+    label: "内销订单",
     value: 1,
   },
   {

+ 1 - 1
src/views/EHSD/saleContract/priceSheetEstimate/index.vue

@@ -229,7 +229,7 @@
                       <tr v-if="row.type == 2">
                         <td :rowspan="getRowSpan(2)" v-if="row.show">
                           <el-button text type="primary" @click="openSelectMaterial=true">选择</el-button>
-                          <div>包材辅材</div>
+                          <div>包材/配件/辅材</div>
                         </td>
                         <td>
                           {{row.code}}

+ 2 - 2
src/views/EHSD/saleContract/priceSheetForeign/index.vue

@@ -290,11 +290,11 @@ const quotationStatusData = ref([
 ]);
 const typeData = ref([
   {
-    label: "常规订单",
+    label: "内销订单",
     value: 1,
   },
   {
-    label: "出口退税订单",
+    label: "外贸订单(退税)",
     value: 2,
   },
 ]);

+ 2 - 2
src/views/EHSD/saleContract/productionReport/index.vue

@@ -33,8 +33,8 @@
         <el-table-column label="损耗" prop="m" align="center">
           <el-table-column label="瑜伽垫(数量)" prop="rawLossCount" width="100" />
           <el-table-column label="瑜伽垫(成本)" prop="rawLossAmount" width="100" />
-          <el-table-column label="包材辅材(数量)" prop="bomLossCount" width="110" />
-          <el-table-column label="包材辅材(成本)" prop="bomLossAmount" width="110" />
+          <el-table-column label="包材/配件/辅材(数量)" prop="bomLossCount" width="110" />
+          <el-table-column label="包材/配件/辅材(成本)" prop="bomLossAmount" width="110" />
           <el-table-column label="返工(道)" prop="reworkCount" width="100" />
           <el-table-column label="返工(成本)" prop="reworkAmount" width="100" />
         </el-table-column>

+ 9 - 4
src/views/MES/processScheduling/index.vue

@@ -245,11 +245,15 @@ const contractTypeData = ref([
   },
   {
     dictKey: "2",
-    dictValue: "常规订单",
+    dictValue: "内销订单",
   },
   {
     dictKey: "1",
-    dictValue: "出口退税订单",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
   },
 ]);
 
@@ -257,7 +261,8 @@ const selectConfig = computed(() => [
   {
     label: "业务公司",
     prop: "contractCompanyId",
-    data: proxy.useUserStore().allDict["list_company_data"],
+    data: companyData.value,
+    isFilter: false,
   },
   // {
   //   label: "工厂",
@@ -745,7 +750,7 @@ const getProcesses = () => {
           isNeedHeaderSlot: false,
           width: 100,
           align: "center",
-          fixed: "right",
+          // fixed: "right",
         };
         config.value.push({
           attrs,

+ 8 - 3
src/views/MES/productionOrder/index.vue

@@ -325,11 +325,15 @@ const contractTypeData = ref([
   },
   {
     dictKey: "2",
-    dictValue: "常规订单",
+    dictValue: "内销订单",
   },
   {
     dictKey: "1",
-    dictValue: "出口退税订单",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
   },
 ]);
 const selectConfig = computed(() => [
@@ -344,7 +348,8 @@ const selectConfig = computed(() => [
   {
     label: "业务公司",
     prop: "contractCompanyId",
-    data: proxy.useUserStore().allDict["list_company_data"],
+    data: companyData.value,
+    isFilter: false,
   },
   {
     label: "订单类型",

+ 8 - 3
src/views/MES/productionTask/index.vue

@@ -397,11 +397,15 @@ const contractTypeData = ref([
   },
   {
     dictKey: "2",
-    dictValue: "常规订单",
+    dictValue: "内销订单",
   },
   {
     dictKey: "1",
-    dictValue: "出口退税订单",
+    dictValue: "外贸订单(退税)",
+  },
+  {
+    dictKey: "4",
+    dictValue: "外贸订单(不退税)",
   },
 ]);
 
@@ -409,7 +413,8 @@ const selectConfig = computed(() => [
   {
     label: "业务公司",
     prop: "contractCompanyId",
-    data: proxy.useUserStore().allDict["list_company_data"],
+    data: companyData.value,
+    isFilter: false,
   },
   {
     label: "工厂",