cz il y a 1 an
Parent
commit
c140e2b9c6

+ 14 - 0
src/assets/styles/index.scss

@@ -235,6 +235,20 @@ aside {
   padding: 10px !important;
 }
 
+// tag类
+.tag-active {
+  background: #98db6b;
+  color: #fff;
+  border-radius: 2px;
+  padding: 4px;
+}
+
+.tag-active-1 {
+  background: #fa9841;
+  border-radius: 2px;
+  color: #fff;
+  padding: 4px;
+}
 
 
 

+ 1 - 1
src/components/byForm/index.vue

@@ -47,7 +47,7 @@
               label: i.propsTreeLabel || 'label',
               children: i.propsTreeChildren || 'children',
             }" value-key="id" :placeholder="i.placeholder || $t('common.pleaseSelect')" :disabled="i.disabled ? i.disabled : false" check-strictly
-                          :style="i.style?i.style:{width:'100%'}" />
+                          :style="i.style?i.style:{width:'100%'}" default-expand-all />
           <el-date-picker v-model="formData[i.prop]" :readonly="i.readonly ? i.readonly : false" v-else-if="i.type == 'date'" :type="i.itemType"
                           :placeholder="i.placeholder || $t('common.pleaseSelectTime')" @change="(e) => commonsEmit(e, i)"
                           :disabled="i.disabled ? i.disabled : false" :format="i.format ? i.format : dateFormatInit(i.itemType)"

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

@@ -433,10 +433,18 @@ export default defineComponent({
         return;
       }
       i.label = item.label || item.dictValue;
+      let value = null;
+      if (item.value !== "" && item.value != undefined) {
+        value = item.value;
+      } else if (item.dictKey !== "" && item.dictKey != undefined) {
+        value = item.dictKey;
+      } else {
+        console.log("过滤");
+      }
       proxy.$emit(
         "getList",
         Object.assign(props.filterParams, {
-          [i.prop]: item.value || item.dictKey,
+          [i.prop]: value,
         })
       );
     };

+ 58 - 3
src/components/process/SF/Contract.vue

@@ -1172,13 +1172,69 @@ const getAllData = (businessId) => {
     }
   });
 };
-
+const getPriceSheetData = (id) => {
+  proxy.post("/extQuotation/detail", { id }).then((res) => {
+    formData.data = res;
+    formData.data = {
+      companyId: res.companyId,
+      buyCorporationId: res.buyCorporationId,
+      buyAddress: res.buyAddress,
+      buyPostalCode: res.buyPostalCode,
+      buyContactName: res.buyContactName,
+      buyContactNumber: res.buyContactNumber,
+    };
+    if (res.type == 1) {
+      formData.data.contractType = "2";
+      if (currencyData.value && currencyData.value.length > 0) {
+        formData.data.currency = currencyData.value[0].dictKey;
+      }
+      formData.data.rate = 1;
+    } else {
+      formData.data.contractType = "1";
+    }
+    formData.data.contractProductList = res.quotationProductList.map((x) => ({
+      fileUrl: "",
+      productId: x.productId,
+      productCnName: x.productName,
+      productCode: x.productCode,
+      productLength: x.productLength,
+      productWidth: x.productWidth,
+      productHeight: x.productHeight,
+      prodFilePath: x.productProdImgPath,
+      quantity: x.quantity,
+      price: x.price,
+      amount: x.amount,
+      fileList: [],
+    }));
+    changeProductPrice();
+    let productIds = formData.data.contractProductList.map((x) => x.productId);
+    proxy.getFile(
+      productIds,
+      formData.data.contractProductList,
+      "productId",
+      "fileListOne",
+      "fileUrl"
+    );
+    formData.data.countryId = res.buyCountryId;
+    formData.data.provinceId = res.buyProvinceId;
+    formData.data.cityId = res.buyCityId;
+    if (formData.data.countryId) {
+      getCityData(formData.data.countryId, "20");
+    }
+    if (formData.data.provinceId) {
+      getCityData(formData.data.provinceId, "30");
+    }
+  });
+};
 onMounted(() => {
   if (currencyData.value && currencyData.value.length > 0) {
     formData.data.currency = currencyData.value[0].dictKey;
   }
   formOption.disabled = judgeStatus();
-  if (route.query && route.query.businessId && route.query.processType) {
+  // 报价转销售订单
+  if (route.query && route.query.priceSheetId) {
+    getPriceSheetData(route.query.priceSheetId);
+  } else if (route.query && route.query.businessId && route.query.processType) {
     let businessId = route.query.businessId;
     getAllData(businessId);
   }
@@ -1187,7 +1243,6 @@ onMounted(() => {
 watch(
   () => props.queryData,
   (val) => {
-    console.log(val, "ssssssss");
     nextTick(() => {
       formOption.disabled = judgeStatus();
     });

+ 32 - 1
src/components/selectCity/index.vue

@@ -7,7 +7,7 @@
   </div>
 </template>
 <script setup>
-import { reactive, ref } from "vue";
+import { reactive, ref, watch } from "vue";
 
 const { proxy } = getCurrentInstance();
 const showModel = ref("");
@@ -68,6 +68,37 @@ watch(
   },
   {
     immediate: true,
+    deep: true,
+  }
+);
+
+watch(
+  () => proxy.data,
+  () => {
+    if (
+      !formData.value[proxy.addressId || "provinceId"] &&
+      !formData.value[proxy.addressName || "provinceName"]
+    ) {
+      if (formData.value[proxy.addressId || "provinceId"] === "-1") {
+        showModel.value = "";
+        formData.value[proxy.addressId || "provinceId"] = "";
+        formData.value[proxy.addressName || "provinceName"] = "";
+      } else {
+        showModel.value = "";
+      }
+    } else {
+      if (formData.value[proxy.addressId || "provinceId"] === "-1") {
+        showModel.value =
+          formData.value[proxy.addressId || "provinceId"] ||
+          formData.value[proxy.addressName || "provinceName"];
+        formData.value[proxy.addressId || "provinceId"] = "";
+        formData.value[proxy.addressName || "provinceName"] = "";
+      } else {
+        showModel.value =
+          formData.value[proxy.addressId || "provinceId"] ||
+          formData.value[proxy.addressName || "provinceName"];
+      }
+    }
   }
 );
 const getCityData = (val) => {

+ 75 - 32
src/views/EHSD/productLibrary/companyProduct/index.vue

@@ -104,7 +104,7 @@
       </template>
     </el-dialog>
 
-    <el-dialog :title="'BOM 配置'" v-model="bomDialog" width="50%" destroy-on-close>
+    <el-dialog :title="'BOM 配置'" v-model="bomDialog" width="60%" destroy-on-close>
       <!-- <div class="public_height_dialog"> -->
       <byForm :formConfig="bomFormConfig" :formOption="bomFormOption" v-model="formData.bomData" :rules="bomRules" ref="bomFormDom"
               v-loading="submitLoading">
@@ -169,14 +169,15 @@ import byForm from "@/components/byForm/index";
 import treeList from "@/components/product/treeList";
 import SelectMaterial from "@/components/product/SelectMaterial.vue";
 import { getToken } from "@/utils/auth";
-import { async } from "@antv/x6/lib/registry/marker/async";
 const { proxy } = getCurrentInstance();
 const actionUrl = import.meta.env.VITE_APP_BASE_API;
 const loading = ref(false);
 const submitLoading = ref(false);
 const treeData = ref([]);
+const treeDataOne = ref([]);
 const treeListData = ref([]);
 const technologyData = ref([]);
+const companyData = ref([]);
 const currencyData = computed(
   () => proxy.useUserStore().allDict["account_currency"]
 );
@@ -206,6 +207,7 @@ const openExcelDialog = ref(false);
 const excelLoading = ref(false);
 const modalType = ref("add");
 const rules = ref({
+  companyId: [{ required: true, message: "请选择归属公司", trigger: "change" }],
   productClassifyId: [
     { required: true, message: "请选择产品分类", trigger: "change" },
   ],
@@ -218,7 +220,13 @@ const rules = ref({
 const props = defineProps({
   selectStatus: Boolean,
 });
-const selectConfig = computed(() => []);
+const selectConfig = computed(() => [
+  {
+    label: "归属公司",
+    prop: "companyId",
+    data: companyData.value,
+  },
+]);
 const config = computed(() => {
   return [
     {
@@ -231,39 +239,46 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "归属公司",
+        prop: "companyName",
+        width: 150,
+      },
+    },
+    {
+      attrs: {
         label: "产品分类",
         prop: "classifyName",
-        "min-width": 150,
+        "min-width": 200,
       },
     },
     {
       attrs: {
         label: "产品编码",
         prop: "customCode",
-        width: 120,
+        width: 180,
       },
     },
     {
       attrs: {
         label: "产品名称",
         slot: "name",
-        "min-width": 150,
-      },
-    },
-    {
-      attrs: {
-        label: "产品英文名",
-        prop: "nameEnglish",
-        "min-width": 120,
-      },
-    },
-    {
-      attrs: {
-        label: "产品规格",
-        prop: "spec",
-        width: 120,
+        "min-width": 200,
       },
     },
+    // {
+    //   attrs: {
+    //     label: "产品英文名",
+    //     prop: "nameEnglish",
+    //     "min-width": 120,
+    //   },
+    // },
+    // {
+    //   attrs: {
+    //     label: "产品规格",
+    //     prop: "spec",
+    //     width: 120,
+    //   },
+    // },
     {
       attrs: {
         label: "尺寸",
@@ -290,25 +305,25 @@ const config = computed(() => {
         width: 100,
       },
     },
+    // {
+    //   attrs: {
+    //     label: "海关编码",
+    //     prop: "hsCode",
+    //     width: 100,
+    //   },
+    // },
     {
       attrs: {
-        label: "海关编码",
-        prop: "hsCode",
-        width: 100,
+        label: "原材料编码",
+        prop: "rawMaterialCode",
+        width: 120,
       },
     },
     {
       attrs: {
         label: "原材料",
         prop: "rawMaterialName",
-        width: 150,
-      },
-    },
-    {
-      attrs: {
-        label: "原材料编码",
-        prop: "rawMaterialCode",
-        width: 120,
+        "min-width": 300,
       },
     },
     {
@@ -401,10 +416,19 @@ const formConfig = computed(() => {
     },
     {
       type: "treeSelect",
+      prop: "companyId",
+      label: "归属公司",
+      data: treeDataOne.value,
+      propsTreeLabel: "deptName",
+      propsTreeValue: "deptId",
+      itemWidth: 50,
+    },
+    {
+      type: "treeSelect",
       prop: "productClassifyId",
       label: "产品分类",
       data: treeData.value,
-      itemWidth: 100,
+      itemWidth: 50,
       disabled: false,
     },
     {
@@ -566,6 +590,25 @@ const getList = (req) => {
   );
 };
 
+const getDict = () => {
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      tenantId: proxy.useUserStore().user.tenantId,
+      type: 0,
+    })
+    .then((res) => {
+      companyData.value = res.data.map((x) => ({
+        ...x,
+        label: x.deptName,
+        value: x.deptId,
+      }));
+      treeDataOne.value = proxy.handleTree(res.data, "deptId");
+    });
+};
+getDict();
 const treeChange = (e) => {
   if (e.id != undefined) {
     sourceList.value.pagination.productClassifyId = e.id;

+ 395 - 107
src/views/EHSD/saleContract/priceSheetEHSD/index.vue

@@ -15,6 +15,19 @@
           </div>
         </template>
 
+        <template #status="{ item }">
+          <div style="width: 100%">
+            <span :style="{color: item.status ==99? 'red' :''}">{{dictValueLabel(item.status, statusData)}}</span>
+          </div>
+        </template>
+
+        <template #quotationStatus="{item}">
+          <div style="width: 100%">
+            <span
+                  :class="{ 'tag-active-1': item.quotationStatus==1, 'tag-active': item.quotationStatus==2 }">{{dictValueLabel(item.quotationStatus, quotationStatusData)}}</span>
+          </div>
+        </template>
+
         <template #amount="{ item }">
           <div>
             <span style="padding-right: 4px">{{ item.currency }}</span>
@@ -25,14 +38,17 @@
           <div style="width:100%;">
             <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
               <div default>
-                <span v-for="(product,index) in item.quotationProductList">{{product.productName}} <span
-                        v-if="index<item.quotationProductList.length-1">,</span></span>
+                <div v-for="(product,index) in item.quotationProductList">
+                  {{index+1}}、{{product.productName}}
+                  <!-- <span v-if="index<item.quotationProductList.length-1">,</span> -->
+                </div>
               </div>
               <template #reference>
                 <div style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer">
-                  <span v-for="(product,index) in item.quotationProductList">{{product.productName}} <span
-                          v-if="index<item.quotationProductList.length-1">,</span></span>
-
+                  <span v-for="(product,index) in item.quotationProductList">
+                    {{product.productName}}
+                    <span v-if="index<item.quotationProductList.length-1"> , </span>
+                  </span>
                 </div>
               </template>
             </el-popover>
@@ -47,6 +63,7 @@
             </span>
             <span>
               <el-button type="primary" text v-debounce v-if="item.quotationStatus==2" @click="handleBack(item)">退回</el-button>
+              <el-button type="primary" text v-debounce v-if="item.quotationStatus==2" @click="handleForeign(item)">转对外</el-button>
               <el-button type="primary" text v-debounce v-if="item.status == 30" @click="getDtl(item, false,true)">变更</el-button>
               <el-button type="danger" text v-debounce v-if="item.status !=0" @click="handleRepeal(item,'/saleQuotation/cancellation')">作废</el-button>
             </span>
@@ -523,6 +540,119 @@
       </template>
     </el-dialog>
 
+    <el-dialog v-if="foreignDialog" v-model="foreignDialog" title="转对外报价单" width="70%" append-to-body>
+      <byForm :formConfig="formConfigOne" :formOption="formOptionOne" v-model="formData.data" :rules="rulesOne" ref="formDomOne"
+              v-loading="submitLoading">
+        <template #commodity>
+          <div style="width: 100%;padding-left:25px">
+            <el-table :data="formData.data.quotationProductList" style="width: 100%;" default-expand-all row-key="productId">
+              <el-table-column type="expand" width="50" align="center">
+                <template #default="scope">
+                  <el-table :data="scope.row.quotationProductBomList" style="width: 100%;" :show-header="false">
+                    <el-table-column label="" width="50" />
+                    <el-table-column label="商品图片" width="80">
+                      <template #default="{ row }">
+                        <div v-if="row.fileUrl">
+                          <img :src="row.fileUrl" class="pic" @click="onPicture(row.fileUrl)" />
+                        </div>
+                        <div v-else></div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="productCode" label="商品编码" width="150" />
+                    <el-table-column prop="productName" label="商品名称" min-width="130" />
+                    <el-table-column label="尺寸 cm*cm*cm" width="180">
+                      <template #default="{ row, $index }">
+                        <div style="width: 100%">
+                          {{row.productLength}} * {{row.productWidth}} * {{row.productHeight}}
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="数量" width="110" prop="quantity">
+                    </el-table-column>
+                    <el-table-column label="原本单价" width="100" prop="priceCopy">
+                    </el-table-column>
+                    <el-table-column label="单价" width="150">
+                      <template #default="{ row, $index }">
+                        <div style="width: 100%">
+                          <el-form-item :prop="'quotationProductList.' + scope.$index + '.quotationProductBomList.' + $index + '.price'"
+                                        :rules="rules.price" :inline-message="true" class="margin-b-0 wid100">
+                            <el-input-number onmousewheel="return false;" v-model="row.price" placeholder="请输入" style="width: 100%" :precision="2"
+                                             :controls="false" :min="0" @change="totalAmount()" />
+                          </el-form-item>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column label="系数" width="150">
+                      <template #default="{ row, $index }">
+                        <div style="width: 100%">
+                          <el-form-item :prop="'quotationProductList.' + scope.$index + '.quotationProductBomList.' + $index + '.coefficient'"
+                                        :rules="rules.coefficient" :inline-message="true" class="margin-b-0 wid100">
+                            <el-input-number onmousewheel="return false;" v-model="row.coefficient" placeholder="请输入" style="width: 100%"
+                                             :precision="2" :controls="false" :min="0" @change="totalAmount()" />
+                          </el-form-item>
+                        </div>
+                      </template>
+                    </el-table-column>
+                    <el-table-column prop="amount" label="小计" width="120">
+                    </el-table-column>
+                  </el-table>
+                </template>
+              </el-table-column>
+              <el-table-column label="商品图片" width="80">
+                <template #default="{ row }">
+                  <div v-if="row.fileUrl">
+                    <img :src="row.fileUrl" class="pic" @click="onPicture(row.fileUrl)" />
+                  </div>
+                  <div v-else></div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="productCode" label="商品编码" width="150" />
+              <el-table-column prop="productName" label="商品名称" min-width="130" />
+              <el-table-column label="尺寸 cm*cm*cm" width="180">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    {{row.productLength}} * {{row.productWidth}} * {{row.productHeight}}
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="数量" width="110" prop="quantity">
+              </el-table-column>
+              <el-table-column label="原本单价" width="100" prop="priceCopy">
+              </el-table-column>
+              <el-table-column label="单价" width="150">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    <el-form-item :prop="'quotationProductList.' + $index + '.price'" :rules="rules.price" :inline-message="true"
+                                  class="margin-b-0 wid100">
+                      <el-input-number onmousewheel="return false;" v-model="row.price" placeholder="请输入" style="width: 100%" :precision="2"
+                                       :controls="false" :min="0" @change="totalAmount()" />
+                    </el-form-item>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="系数" width="150">
+                <template #default="{ row, $index }">
+                  <div style="width: 100%">
+                    <el-form-item :prop="'quotationProductList.' + $index + '.coefficient'" :rules="rules.coefficient" :inline-message="true"
+                                  class="margin-b-0 wid100">
+                      <el-input-number onmousewheel="return false;" v-model="row.coefficient" placeholder="请输入" style="width: 100%" :precision="2"
+                                       :controls="false" :min="0" @change="totalAmount()" />
+                    </el-form-item>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="amount" label="小计" width="120">
+              </el-table-column>
+            </el-table>
+          </div>
+        </template>
+      </byForm>
+      <template #footer>
+        <el-button @click="foreignDialog = false" size="default" v-debounce>关 闭</el-button>
+        <el-button type="primary" @click="handleSubmitOne()" size="default" v-debounce>提 交</el-button>
+      </template>
+    </el-dialog>
+
     <el-dialog v-if="openProductCompany" v-model="openProductCompany" title="产品库" width="90%" append-to-body>
       <SelectProduct @selectProduct="selectProduct"></SelectProduct>
       <template #footer>
@@ -554,25 +684,17 @@ const corporationList = ref([]);
 const tradeMethods = ref([]);
 const accountCurrency = ref([]);
 const companyData = ref([]);
-const status = ref([
+const statusData = ref([
   {
     label: "草稿",
     value: 0,
   },
   {
-    label: "审批中",
-    value: 10,
-  },
-  {
-    label: "驳回",
-    value: 20,
-  },
-  {
-    label: "审批通过",
+    label: "正常",
     value: 30,
   },
   {
-    label: "终止",
+    label: "作废",
     value: 99,
   },
 ]);
@@ -596,7 +718,7 @@ const typeData = ref([
     value: "1",
   },
   {
-    label: "外",
+    label: "外",
     value: "2",
   },
 ]);
@@ -615,17 +737,22 @@ const loading = ref(false);
 const selectConfig = computed(() => {
   return [
     {
-      label: "报价状态",
-      prop: "quotationStatus",
-      data: quotationStatusData.value,
+      label: "报价状态",
+      prop: "status",
+      data: statusData.value,
     },
     {
-      label: "报价类型",
+      label: "报价类型",
       prop: "type",
       data: typeData.value,
     },
     {
-      label: "报价公司",
+      label: "子公司报价状态",
+      prop: "quotationStatus",
+      data: quotationStatusData.value,
+    },
+    {
+      label: "报价子公司",
       prop: "companyId",
       data: companyData.value,
     },
@@ -637,14 +764,14 @@ const selectConfig = computed(() => {
       placeholderOne: "结束日期",
       propOne: "quotationTimeEnd",
     },
-    {
-      type: "time",
-      label: "创建时间",
-      placeholder: "开始日期",
-      prop: "beginTime",
-      placeholderOne: "结束日期",
-      propOne: "endTime",
-    },
+    // {
+    //   type: "time",
+    //   label: "创建时间",
+    //   placeholder: "开始日期",
+    //   prop: "beginTime",
+    //   placeholderOne: "结束日期",
+    //   propOne: "endTime",
+    // },
   ];
 });
 
@@ -659,7 +786,14 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "报价类型",
+        label: "报价单状态",
+        slot: "status",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "报价单类型",
         prop: "type",
         width: 100,
       },
@@ -669,7 +803,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "报价公司",
+        label: "报价公司",
         prop: "companyName",
         "min-width": 150,
       },
@@ -683,6 +817,13 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "子公司报价状态",
+        slot: "quotationStatus",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
         label: "报价金额",
         slot: "amount",
         width: 120,
@@ -704,7 +845,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "产品",
+        label: "报价单产品",
         slot: "product",
         "min-width": 180,
       },
@@ -712,7 +853,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "操作",
-        width: 160,
+        width: 200,
         slot: "btn",
         align: "center",
         fixed: "right",
@@ -782,6 +923,34 @@ const newPriceSheet = () => {
 
 const isDetail = ref(false);
 const isChange = ref(false);
+const getFileData = () => {
+  let ids = [];
+  formData.data.quotationProductList.map((x) => {
+    ids.push(x.productId);
+    x.quotationProductBomList.map((y) => {
+      ids.push(y.materialId);
+    });
+  });
+  ids = Array.from(new Set(ids));
+  proxy
+    .post("/fileInfo/getList", {
+      businessIdList: ids,
+    })
+    .then((fileObj) => {
+      formData.data.quotationProductList.map((x) => {
+        x.fileList = fileObj[x.productId] || [];
+        if (x.fileList && x.fileList.length > 0) {
+          x.fileUrl = x.fileList[0].fileUrl;
+        }
+        x.quotationProductBomList.map((y) => {
+          y.fileList = fileObj[y.materialId] || [];
+          if (y.fileList && y.fileList.length > 0) {
+            y.fileUrl = y.fileList[0].fileUrl;
+          }
+        });
+      });
+    });
+};
 const getDtl = (row, flag, change = false) => {
   formOption.disabled = flag;
   modalType.value = "edit";
@@ -799,69 +968,34 @@ const getDtl = (row, flag, change = false) => {
       getCityData(formData.data.buyProvinceId, "30");
     }
     // 文件数据回显
-    let ids = [];
-    formData.data.quotationProductList.map((x) => {
-      ids.push(x.productId);
-      x.quotationProductBomList.map((y) => {
-        ids.push(y.materialId);
-      });
-    });
-    ids = Array.from(new Set(ids));
-    proxy
-      .post("/fileInfo/getList", {
-        businessIdList: ids,
-      })
-      .then((fileObj) => {
-        formData.data.quotationProductList.map((x) => {
-          x.fileList = fileObj[x.productId] || [];
-          if (x.fileList && x.fileList.length > 0) {
-            x.fileUrl = x.fileList[0].fileUrl;
+    getFileData();
+
+    //折线图
+    if (flag && res.quotationTrendList && res.quotationTrendList.length > 0) {
+      nextTick(() => {
+        myChart = echarts.init(chartDom.value);
+        window.addEventListener("resize", () => {
+          myChart.resize();
+        });
+        chartData.value = res.quotationTrendList;
+        chartOption.data.xAxis.data = chartData.value.map((item) => {
+          return item.createTime.slice(0, 10);
+        });
+        chartOption.data.series[0].data = chartData.value.map((item, index) => {
+          if (item.code == row.code) {
+            return {
+              value: item.amount || 0,
+              itemStyle: { color: "red" },
+            };
+          } else {
+            return item.amount || 0;
           }
-          x.quotationProductBomList.map((y) => {
-            y.fileList = fileObj[y.materialId] || [];
-            if (y.fileList && y.fileList.length > 0) {
-              y.fileUrl = y.fileList[0].fileUrl;
-            }
-          });
         });
-      });
-
-    //
-    if (flag) {
-      myChart = echarts.init(chartDom.value);
-      window.addEventListener("resize", () => {
+        myChart.setOption(chartOption.data);
         myChart.resize();
       });
-
-      chartOption.data.xAxis.data = ["0", "0", "2"].map((item) => {
-        // return item.createTime.slice(0, 10);
-        return "2022-02-09";
-      });
-      chartOption.data.series[0].data = ["12", "43", "23"].map((item) => {
-        return item;
-      });
-      myChart.setOption(chartOption.data);
-      myChart.resize();
     }
   });
-  if (flag) {
-    nextTick(() => {
-      myChart = echarts.init(chartDom.value);
-      window.addEventListener("resize", () => {
-        myChart.resize();
-      });
-
-      chartOption.data.xAxis.data = ["0", "0", "2"].map((item) => {
-        // return item.createTime.slice(0, 10);
-        return "2022-02-09";
-      });
-      chartOption.data.series[0].data = ["12", "43", "23"].map((item) => {
-        return item;
-      });
-      myChart.setOption(chartOption.data);
-      myChart.resize();
-    });
-  }
 };
 
 const openPrint = ref(false);
@@ -954,6 +1088,7 @@ const formOption = reactive({
 });
 let myChart = null;
 const chartDom = ref(null);
+const chartData = ref([]);
 const isShowChart = ref(false);
 const formConfig = computed(() => {
   return [
@@ -990,7 +1125,6 @@ const formConfig = computed(() => {
     {
       type: "title1",
       title: "贸易信息",
-      haveLine: true,
     },
     {
       type: "slot",
@@ -1002,7 +1136,6 @@ const formConfig = computed(() => {
     {
       type: "title1",
       title: "商品信息",
-      haveLine: true,
     },
     {
       type: "slot",
@@ -1012,7 +1145,6 @@ const formConfig = computed(() => {
     {
       type: "title1",
       title: "报价总金额",
-      haveLine: true,
     },
     {
       type: "input",
@@ -1032,7 +1164,7 @@ const rules = ref({
   quantity: [{ required: true, message: "请输入数量", trigger: "blur" }],
 });
 
-const getCityData = (id, type, isChange) => {
+const getCityData = (id, type, isChange = false) => {
   proxy.post("/customizeArea/list", { parentId: id }).then((res) => {
     if (type === "20") {
       provinceData.value = res;
@@ -1299,18 +1431,13 @@ const chartOption = reactive({
       // valueFormatter: (val) => {
       //   return val + "aaa";
       // },
-      // formatter: (params, ticket, callback) => {
-      //   return `
-      //   ${params[0].axisValue}
-      //   <br/>
-      //   ${params[0].seriesName}:${params[0].data}
-      //   <br/> 销售合同金额:${
-      //     chartData.value[params[0].dataIndex].contractCurrency
-      //   } ${chartData.value[params[0].dataIndex].contractAmount}
-      //   <br/> 采购合同金额:CNY ${
-      //     chartData.value[params[0].dataIndex].purchaseAmount
-      //   }`;
-      // },
+      formatter: (params, ticket, callback) => {
+        return `
+        ${params[0].seriesName}:${params[0].value}
+        <br/>
+         报价单号:${chartData.value[params[0].dataIndex].code}
+        `;
+      },
       textStyle: {
         fontSize: 12,
       },
@@ -1369,6 +1496,167 @@ const handleRepeal = (row, url) => {
     })
     .catch((err) => {});
 };
+const formDomOne = ref(null);
+const foreignDialog = ref(false);
+const formConfigOne = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "系数",
+    },
+    {
+      type: "number",
+      prop: "coefficient",
+      label: "全局价格系数",
+      precision: 2,
+      min: 0.01,
+      controls: false,
+      itemWidth: 25,
+      fn: (val) => {
+        publicTotalAmount(val);
+      },
+    },
+    {
+      type: "title1",
+      title: "商品信息",
+    },
+    {
+      type: "slot",
+      slotName: "commodity",
+      label: "",
+    },
+    {
+      type: "title1",
+      title: "报价总金额",
+    },
+    {
+      type: "input",
+      prop: "amount",
+      label: "报价总金额",
+      itemWidth: 25,
+      disabled: true,
+    },
+  ];
+});
+
+const formOptionOne = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  disabled: false,
+});
+const rulesOne = ref({
+  price: [{ required: true, message: "请输入单价", trigger: "blur" }],
+  coefficient: [{ required: true, message: "请输入系数", trigger: "blur" }],
+});
+const handleForeign = (row) => {
+  foreignDialog.value = true;
+  proxy.post("/saleQuotation/detail", { id: row.id }).then((res) => {
+    formData.data = res;
+    formData.data.saleQuotationId = res.id;
+    delete formData.data.id;
+    // 复制原本价格
+    for (let i = 0; i < formData.data.quotationProductList.length; i++) {
+      const iele = formData.data.quotationProductList[i];
+      iele.quotationProductId = iele.id;
+      delete iele.id;
+      iele.priceCopy = iele.price;
+      // 默认系数
+      iele.coefficient = 1;
+      for (let j = 0; j < iele.quotationProductBomList.length; j++) {
+        const jele = iele.quotationProductBomList[j];
+        jele.quotationProductBomId = jele.id;
+        delete jele.id;
+        jele.priceCopy = jele.price;
+        // 默认系数
+        jele.coefficient = 1;
+      }
+    }
+    // 城市数据回显
+    if (formData.data.buyCountryId) {
+      getCityData(formData.data.buyCountryId, "20");
+    }
+    if (formData.data.buyProvinceId) {
+      getCityData(formData.data.buyProvinceId, "30");
+    }
+    // 文件数据回显
+    getFileData();
+  });
+};
+
+const publicTotalAmount = (val) => {
+  if (val) {
+    let money = 0;
+    if (
+      formData.data.quotationProductList &&
+      formData.data.quotationProductList.length > 0
+    ) {
+      for (let i = 0; i < formData.data.quotationProductList.length; i++) {
+        let iele = formData.data.quotationProductList[i];
+        iele.coefficient = val;
+        iele.price = iele.priceCopy * val;
+        iele.amount = parseFloat(
+          Number(iele.quantity) * Number(iele.price)
+        ).toFixed(2);
+        money += Number(iele.amount);
+        for (let j = 0; j < iele.quotationProductBomList.length; j++) {
+          const jele = iele.quotationProductBomList[j];
+          jele.coefficient = val;
+          jele.price = jele.priceCopy * val;
+          jele.amount = parseFloat(
+            Number(jele.quantity) * Number(jele.price)
+          ).toFixed(2);
+          money += Number(jele.amount);
+        }
+      }
+    }
+    formData.data.amount = parseFloat(money).toFixed(2);
+  }
+};
+
+const totalAmount = () => {
+  formData.data.coefficient = null;
+  let money = 0;
+  if (
+    formData.data.quotationProductList &&
+    formData.data.quotationProductList.length > 0
+  ) {
+    for (let i = 0; i < formData.data.quotationProductList.length; i++) {
+      let iele = formData.data.quotationProductList[i];
+      iele.price = iele.priceCopy * iele.coefficient;
+      iele.amount = parseFloat(
+        Number(iele.quantity) * Number(iele.price)
+      ).toFixed(2);
+      money += Number(iele.amount);
+      for (let j = 0; j < iele.quotationProductBomList.length; j++) {
+        const jele = iele.quotationProductBomList[j];
+        jele.price = jele.priceCopy * jele.coefficient;
+        jele.amount = parseFloat(
+          Number(jele.quantity) * Number(jele.price)
+        ).toFixed(2);
+        money += Number(jele.amount);
+      }
+    }
+  }
+  formData.data.amount = parseFloat(money).toFixed(2);
+};
+
+const handleSubmitOne = () => {
+  formDomOne.value.handleSubmit(() => {
+    proxy
+      .msgConfirm()
+      .then((res) => {
+        submitLoading.value = true;
+        proxy.post("/extQuotation/add", formData.data).then((res) => {
+          proxy.msgTip("操作成功", 1);
+          submitLoading.value = false;
+          foreignDialog.value = false;
+          getList();
+        });
+      })
+      .catch((err) => {});
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 56 - 15
src/views/EHSD/saleContract/priceSheetEstimate/index.vue

@@ -11,6 +11,19 @@
         </div>
       </template>
 
+      <template #status="{ item }">
+        <div style="width: 100%">
+          <span :style="{color: item.status ==99? 'red' :''}">{{dictValueLabel(item.status, statusData)}}</span>
+        </div>
+      </template>
+
+      <template #quotationStatus="{item}">
+        <div style="width: 100%">
+          <span
+                :class="{ 'tag-active-1': item.quotationStatus==1, 'tag-active': item.quotationStatus==2 }">{{dictValueLabel(item.quotationStatus, quotationStatusData)}}</span>
+        </div>
+      </template>
+
       <template #amount="{ item }">
         <div>
           <span style="padding-right: 4px">{{ item.currency }}</span>
@@ -22,14 +35,17 @@
         <div style="width:100%;">
           <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
             <div default>
-              <span v-for="(product,index) in item.quotationProductList">{{product.productName}} <span
-                      v-if="index<item.quotationProductList.length-1">,</span></span>
+              <div v-for="(product,index) in item.quotationProductList">
+                {{index+1}}、{{product.productName}}
+                <!-- <span v-if="index<item.quotationProductList.length-1">,</span> -->
+              </div>
             </div>
             <template #reference>
               <div style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer">
-                <span v-for="(product,index) in item.quotationProductList">{{product.productName}} <span
-                        v-if="index<item.quotationProductList.length-1">,</span></span>
-
+                <span v-for="(product,index) in item.quotationProductList">
+                  {{product.productName}}
+                  <span v-if="index<item.quotationProductList.length-1"> , </span>
+                </span>
               </div>
             </template>
           </el-popover>
@@ -145,6 +161,20 @@ const sourceList = ref({
 });
 const loading = ref(false);
 const openAddDialog = ref(false);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "正常",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 99,
+  },
+]);
 const quotationStatusData = ref([
   {
     label: "未报价",
@@ -162,7 +192,12 @@ const quotationStatusData = ref([
 const selectConfig = computed(() => {
   return [
     {
-      label: "报价状态",
+      label: "报价单状态",
+      prop: "status",
+      data: statusData.value,
+    },
+    {
+      label: "子公司报价状态",
       prop: "quotationStatus",
       data: quotationStatusData.value,
     },
@@ -174,14 +209,6 @@ const selectConfig = computed(() => {
       placeholderOne: "结束日期",
       propOne: "quotationTimeEnd",
     },
-    {
-      type: "time",
-      label: "创建时间",
-      placeholder: "开始日期",
-      prop: "beginTime",
-      placeholderOne: "结束日期",
-      propOne: "endTime",
-    },
   ];
 });
 
@@ -196,6 +223,20 @@ const config = computed(() => {
     },
     {
       attrs: {
+        label: "报价单状态",
+        slot: "status",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "子公司报价状态",
+        slot: "quotationStatus",
+        width: 130,
+      },
+    },
+    {
+      attrs: {
         label: "报价金额",
         slot: "amount",
         width: 120,
@@ -217,7 +258,7 @@ const config = computed(() => {
     },
     {
       attrs: {
-        label: "产品",
+        label: "报价单产品",
         slot: "product",
         "min-width": 180,
       },

+ 462 - 0
src/views/EHSD/saleContract/priceSheetForeign/index.vue

@@ -0,0 +1,462 @@
+<template>
+  <div class="pageIndexClass">
+    <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" :selectConfig="selectConfig"
+             highlight-current-row :action-list="[
+        ]" @get-list="getList">
+
+      <template #code="{ item }">
+        <div style="width: 100%">
+          {{ item.code }}
+          <!-- <span style="color: #409eff; cursor: pointer; word-break: break-all" @click="handleGenerate(item,true)">{{ item.code }}</span> -->
+        </div>
+      </template>
+
+      <template #amount="{ item }">
+        <div>
+          <span style="padding-right: 4px">{{ item.currency }}</span>
+          <span>{{ moneyFormat(item.amount, 2) }}</span>
+        </div>
+      </template>
+
+      <template #status="{ item }">
+        <div style="width: 100%">
+          <span :style="{color: item.status ==99? 'red' :''}">{{dictValueLabel(item.status, statusData)}}</span>
+        </div>
+      </template>
+
+      <template #follow="{ item }">
+        <div style="width: 100%">
+          <div style="width: 100%; display: flex">
+            <template v-if="
+                item.extQuotationFollowList &&
+                item.extQuotationFollowList.length > 0
+              ">
+              <div class="tag" :style="
+                  index > 2
+                    ? 'display: none'
+                    : ''
+                " v-for="(record, index) in item.extQuotationFollowList" :key="record.id">
+                <el-popover placement="bottom" :width="300" trigger="hover">
+                  <template #default>
+                    <div style="width: 100%">
+                      <div style="color: #909399; margin: 8px 0">
+                        跟进时间: {{ record.followTime }}
+                      </div>
+                      <div style="margin-top: 8px">
+                        跟进说明: {{ record.remark }}
+                      </div>
+                    </div>
+                  </template>
+                  <template #reference>
+                    <div>
+                      <span v-if="record.followTime">{{
+                        record.followTime.substr(0, 10)
+                      }}</span>
+                      <el-icon style="margin-left: 8px; transform: translateY(2px)" @click="deleteFollow(record)">
+                        <DeleteFilled />
+                      </el-icon>
+                    </div>
+                  </template>
+                </el-popover>
+              </div>
+              <div class="tag" @click="clickMore(item)" v-if="item.extQuotationFollowList.length > 3">
+                更多
+              </div>
+            </template>
+          </div>
+        </div>
+      </template>
+
+      <template #product="{ item }">
+        <div style="width:100%;">
+          <el-popover placement="bottom-start" title="" :width="300" trigger="hover">
+            <div default>
+              <div v-for="(product,index) in item.quotationProductList">
+                {{index+1}}、{{product.productName}}
+                <!-- <span v-if="index<item.quotationProductList.length-1">,</span> -->
+              </div>
+            </div>
+            <template #reference>
+              <div style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer">
+                <span v-for="(product,index) in item.quotationProductList">
+                  {{product.productName}}
+                  <span v-if="index<item.quotationProductList.length-1"> , </span>
+                </span>
+              </div>
+            </template>
+          </el-popover>
+        </div>
+      </template>
+
+      <template #btn="{item}">
+        <div style="width: 100%">
+          <el-button type="primary" text v-debounce @click="handleFollow(item)">跟进</el-button>
+          <el-button type="primary" text v-debounce @click="handleGenerate(item)">生成订单</el-button>
+          <el-button type="danger" text v-debounce v-if="item.status !=0" @click="handleRepeal(item)">作废</el-button>
+        </div>
+      </template>
+    </byTable>
+    <el-dialog v-if="followDialog" v-model="followDialog" title="跟进" width="600" append-to-body>
+      <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="formDom" v-loading="submitLoading">
+      </byForm>
+      <template #footer>
+        <el-button @click="followDialog = false" size="default" v-debounce>关 闭</el-button>
+        <el-button type="primary" @click="handleSubmit()" size="default" v-debounce>提 交</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="跟进记录" v-if="openRecordMore" v-model="openRecordMore" width="800" destroy-on-close>
+      <div>
+        <el-button style="margin:0px 0px 20px 20px" type="primary" plain v-debounce @click="handleFollow(rowData)">添加跟进记录</el-button>
+        <el-timeline>
+          <el-timeline-item v-for="(record, index) in recordAllData" :key="record.id" :timestamp="record.followTime" hide-timestamp>
+            <div>
+              跟进时间:{{ record.followTime }}
+            </div>
+            <div style="word-wrap: break-word; margin: 8px 0">
+              跟进说明:{{ record.remark }}
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+      </div>
+      <template #footer>
+        <el-button @click="openRecordMore = false" size="default" v-debounce>关 闭</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import byTable from "@/components/byTable/index";
+import moment from "moment";
+import byForm from "@/components/byForm/index";
+
+const { proxy } = getCurrentInstance();
+const accountList = ref([]);
+const corporationList = ref([]);
+const tradeMethods = ref([]);
+const accountCurrency = ref([]);
+const companyData = ref([]);
+const statusData = ref([
+  {
+    label: "草稿",
+    value: 0,
+  },
+  {
+    label: "正常",
+    value: 30,
+  },
+  {
+    label: "作废",
+    value: 99,
+  },
+]);
+const quotationStatusData = ref([
+  {
+    label: "未报价",
+    value: 0,
+  },
+  {
+    label: "报价中",
+    value: 1,
+  },
+  {
+    label: "已报价",
+    value: 2,
+  },
+]);
+const typeData = ref([
+  {
+    label: "内销",
+    value: "1",
+  },
+  {
+    label: "外销",
+    value: "2",
+  },
+]);
+const sourceList = ref({
+  data: [],
+  pagination: {
+    total: 0,
+    pageNum: 1,
+    pageSize: 10,
+    keyword: "",
+    status: "",
+    sellCorporationId: "",
+  },
+});
+const loading = ref(false);
+const selectConfig = computed(() => {
+  return [
+    {
+      label: "报价单状态",
+      prop: "status",
+      data: statusData.value,
+    },
+    {
+      label: "报价单类型",
+      prop: "type",
+      data: typeData.value,
+    },
+    {
+      type: "time",
+      label: "报价时间",
+      placeholder: "开始日期",
+      prop: "quotationTimeSta",
+      placeholderOne: "结束日期",
+      propOne: "quotationTimeEnd",
+    },
+  ];
+});
+
+const config = computed(() => {
+  return [
+    {
+      attrs: {
+        label: "报价单号",
+        slot: "code",
+        width: 180,
+      },
+    },
+    {
+      attrs: {
+        label: "报价单状态",
+        slot: "status",
+        width: 100,
+      },
+    },
+    {
+      attrs: {
+        label: "报价单类型",
+        prop: "type",
+        width: 100,
+      },
+      render(val) {
+        return proxy.dictValueLabel(val, typeData.value);
+      },
+    },
+    {
+      attrs: {
+        label: "客户名称",
+        prop: "buyCorporationName",
+        "min-width": 150,
+      },
+    },
+    {
+      attrs: {
+        label: "报价金额",
+        slot: "amount",
+        width: 120,
+      },
+    },
+    {
+      attrs: {
+        label: "报价时间",
+        prop: "quotationTime",
+        width: 160,
+      },
+    },
+    {
+      attrs: {
+        label: "报价单产品",
+        slot: "product",
+        "min-width": 180,
+      },
+    },
+    {
+      attrs: {
+        label: "跟进",
+        slot: "follow",
+        "min-width": 360,
+      },
+    },
+    {
+      attrs: {
+        label: "操作",
+        width: 200,
+        slot: "btn",
+        align: "center",
+        fixed: "right",
+      },
+    },
+  ];
+});
+
+const getDict = () => {
+  // proxy
+  //   .post("/customer/selPage", {
+  //     pageNum: 1,
+  //     pageSize: 50,
+  //   })
+  //   .then((res) => {
+  //     customerList.value = res.rows.map((x) => ({
+  //       ...x,
+  //       label: x.name,
+  //       value: x.id,
+  //     }));
+  //   });
+
+  proxy
+    .get("/tenantDept/list", {
+      pageNum: 1,
+      pageSize: 9999,
+      keyword: "",
+      tenantId: proxy.useUserStore().user.tenantId,
+      type: 0,
+    })
+    .then((res) => {
+      companyData.value = res.data.map((x) => ({
+        ...x,
+        label: x.deptName,
+        value: x.deptId,
+      }));
+    });
+};
+const getList = async (req) => {
+  sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
+  loading.value = true;
+  proxy.post("/extQuotation/page", sourceList.value.pagination).then((res) => {
+    sourceList.value.data = res.rows;
+    sourceList.value.pagination.total = res.total;
+    setTimeout(() => {
+      loading.value = false;
+    }, 200);
+  });
+};
+getDict();
+getList();
+const formDom = ref(null);
+const followDialog = ref(false);
+const submitLoading = ref(false);
+const formData = reactive({
+  data: {},
+});
+const formOption = reactive({
+  inline: true,
+  labelWidth: 100,
+  itemWidth: 100,
+  disabled: false,
+});
+
+const formConfig = computed(() => {
+  return [
+    {
+      type: "title1",
+      title: "跟进信息",
+    },
+    {
+      type: "date",
+      itemType: "datetime",
+      prop: "followTime",
+      label: "跟进时间",
+      itemWidth: 100,
+      disabled: false,
+    },
+    {
+      type: "input",
+      itemType: "textarea",
+      prop: "remark",
+      label: "跟进说明",
+      itemWidth: 100,
+      disabled: false,
+    },
+  ];
+});
+const rules = ref({
+  followTime: [
+    { required: true, message: "请选择跟进时间", trigger: "change" },
+  ],
+  remark: [{ required: true, message: "请输入跟进说明", trigger: "blur" }],
+});
+
+const handleFollow = (row) => {
+  formData.data = {
+    quotationId: row.id,
+    followTime: moment().format("yyyy-MM-DD HH:mm:ss"),
+    remark: "",
+  };
+  followDialog.value = true;
+};
+
+const handleSubmit = (type) => {
+  formDom.value.handleSubmit(() => {
+    submitLoading.value = true;
+    proxy.post("/extQuotationFollow/add", formData.data).then(
+      (res) => {
+        proxy.msgTip("操作成功", 1);
+        followDialog.value = false;
+        submitLoading.value = false;
+        getList();
+      },
+      (err) => {
+        submitLoading.value = false;
+      }
+    );
+  });
+};
+
+const deleteFollow = (record) => {
+  proxy
+    .msgConfirm()
+    .then((res) => {
+      proxy
+        .post("/extQuotationFollow/delete", {
+          id: record.id,
+        })
+        .then((res) => {
+          proxy.msgTip("操作成功", 1);
+          getList();
+        });
+    })
+    .catch((err) => {});
+};
+
+const openRecordMore = ref(false);
+const recordAllData = ref([]);
+const rowData = ref({});
+const clickMore = (row) => {
+  rowData.value = row;
+  recordAllData.value = proxy.deepClone(row.extQuotationFollowList);
+  openRecordMore.value = true;
+};
+
+const handleGenerate = (row) => {
+  proxy.$router.replace({
+    path: "/platform_manage/process/processApproval",
+    query: {
+      priceSheetId: row.id,
+      flowKey: "contract_flow",
+      flowName: "销售合同审批流程",
+      random: proxy.random(),
+    },
+  });
+};
+
+const handleRepeal = (row) => {
+  proxy
+    .msgConfirm()
+    .then((res) => {
+      proxy
+        .post("/extQuotation/cancellation", {
+          id: row.id,
+        })
+        .then((res) => {
+          proxy.msgTip("操作成功", 1);
+          getList();
+        });
+    })
+    .catch((err) => {});
+};
+</script>
+
+<style lang="scss" scoped>
+.tag {
+  line-height: 32px;
+  margin-right: 8px;
+  padding: 0 8px;
+  background-color: #eeeeee;
+  border-radius: 4px;
+  cursor: pointer;
+}
+</style>

+ 1 - 1
src/views/customer/addCustomer.vue

@@ -207,7 +207,7 @@ getDict();
 const countryData = ref([]);
 const provinceData = ref([]);
 const cityData = ref([]);
-const getCityData = (id, type, isChange) => {
+const getCityData = (id, type, isChange = false) => {
   proxy.post("/customizeArea/list", { parentId: id }).then((res) => {
     if (type === "20") {
       provinceData.value = res;

+ 11 - 11
src/views/product/material/index.vue

@@ -157,21 +157,21 @@ const config = computed(() => {
       attrs: {
         label: "物料分类",
         prop: "classifyName",
-        "min-width": 150,
+        "min-width": 200,
       },
     },
     {
       attrs: {
         label: "物料编码",
         prop: "customCode",
-        width: 120,
+        width: 190,
       },
     },
     {
       attrs: {
-        label: " 物料名称",
+        label: "物料名称",
         slot: "name",
-        "min-width": 150,
+        "min-width": 300,
       },
     },
     {
@@ -181,13 +181,13 @@ const config = computed(() => {
         width: 120,
       },
     },
-    {
-      attrs: {
-        label: "物料型号",
-        prop: "spec",
-        width: 120,
-      },
-    },
+    // {
+    //   attrs: {
+    //     label: "物料型号",
+    //     prop: "spec",
+    //     width: 120,
+    //   },
+    // },
     {
       attrs: {
         label: "单位",