Browse Source

部分功能修改,关于售后

cz 1 năm trước cách đây
mục cha
commit
e06fb478c2

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1
src/assets/icons/svg/afterSales.svg


+ 1 - 0
src/assets/icons/svg/afterSalesOne.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1714289312829" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="39721" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M909.081585 144.171358L514.305389 5.345889l-1.86268-5.345889L103.137616 144.171358H101.964128v488.785608h1.080354c21.811972 217.765807 408.951184 393.658589 408.951185 391.013585S899.190759 850.424744 920.946851 632.938339h1.080354V144.171358z m-30.492056 472.487166c-3.259688 201.169337-366.500729 361.452869-366.500729 363.855725s-363.222414-162.649134-366.500728-363.855725V175.333978l360.651916-127.03471 372.535809 131.002217v437.357039z" fill="#1296db" p-id="39722"></path><path d="M503.408716 229.500685l35.390902-20.992393q22.799192 29.411702 43.661197 60.239041l-20.992393 12.703471h202.212437v34.254667H567.503502v39.786825h179.04071v34.254667h-179.04071v39.786825h179.04071V463.807082h-179.04071v40.978939h207.223044v34.254668H345.975083v21.439435h-40.978939V373.16912q-22.221761 26.077507-46.417961 50.292334a341.782978 341.782978 0 0 0-25.965746-34.813471A575.567825 575.567825 0 0 0 361.938243 212.345411l39.786824 14.361255q-14.901432 27.809798-31.497903 54.706884h167.976397q-16.317068-26.692191-34.794845-51.950119zM306.132379 582.031321h417.761656V759.97305h-40.978939v-28.182334H347.018184V759.97305h-40.978939v-177.941729zM345.975083 355.473669h180.679868v-39.786825h-178.51916l-2.160708 3.334196v36.471256z m0 74.041492h180.679868v-39.768198h-180.679868v39.786825z m0 75.140472h180.679868V463.807082h-180.679868v40.978939z m337.144907 112.729336H347.018184v79.014845h335.971419v-78.996218z" fill="#1296db" p-id="39723"></path></svg>

+ 9 - 9
src/components/SvgIcon/index.vue

@@ -9,15 +9,15 @@ export default defineComponent({
   props: {
     iconClass: {
       type: String,
-      required: true
+      required: true,
     },
     className: {
       type: String,
-      default: ''
+      default: "",
     },
     color: {
       type: String,
-      default: ''
+      default: "",
     },
   },
   setup(props) {
@@ -25,13 +25,13 @@ export default defineComponent({
       iconName: computed(() => `#icon-${props.iconClass}`),
       svgClass: computed(() => {
         if (props.className) {
-          return `svg-icon ${props.className}`
+          return `svg-icon ${props.className}`;
         }
-        return 'svg-icon'
-      })
-    }
-  }
-})
+        return "svg-icon";
+      }),
+    };
+  },
+});
 </script>
 
 <style scope lang="scss">

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

@@ -583,7 +583,7 @@ export default defineComponent({
     margin: 0;
     li {
       list-style: none;
-      min-width: 285px;
+      min-width: 160px;
       box-sizing: border-box;
       margin: 0 20px 20px 0;
       background: #eff6ff;

+ 2 - 0
src/components/process/EHSD/AfterSales.vue

@@ -318,6 +318,8 @@ const handleSelect = (row) => {
     formData.data.afterSalesDetailList.length == 0
   ) {
     formData.data.contractId = row.contractId;
+    formData.data.contactName = row.buyContactName;
+    formData.data.contactTel = row.buyContactNumber;
     formData.data.currency = row.currency;
     formData.data.afterSalesDetailList.push({
       contractProductId: row.id,

+ 26 - 26
src/views/EHSD/procurement/profitBudgetEHSD/index.vue

@@ -441,6 +441,32 @@ const statConfig = computed(() => [
     data: [
       //一个卡牌多数据配置
       {
+        label: "收支统计(CNY)",
+        type: 1,
+        data: [
+          {
+            label: "总收入",
+            num: proxy.moneyFormat(headerData.value.totalIncomeSumAmount, 2),
+            color: "#0084ff",
+          },
+          {
+            label: "总支出",
+            num: proxy.moneyFormat(headerData.value.totalExpensesSumAmount, 2),
+            color: "#0084ff",
+          },
+          {
+            label: "总毛利",
+            num: proxy.moneyFormat(headerData.value.grossProfitSum, 2),
+            color: "#0084ff",
+          },
+          {
+            label: "毛利率",
+            num: headerData.value.grossProfitMargin + " %",
+            color: "#0084ff",
+          },
+        ],
+      },
+      {
         label: "订单统计(CNY)",
         type: 2,
         data: [
@@ -521,32 +547,6 @@ const statConfig = computed(() => [
           },
         ],
       },
-      {
-        label: "收支统计(CNY)",
-        type: 1,
-        data: [
-          {
-            label: "总收入",
-            num: proxy.moneyFormat(headerData.value.totalIncomeSumAmount, 2),
-            color: "#0084ff",
-          },
-          {
-            label: "总支出",
-            num: proxy.moneyFormat(headerData.value.totalExpensesSumAmount, 2),
-            color: "#0084ff",
-          },
-          {
-            label: "总毛利",
-            num: proxy.moneyFormat(headerData.value.grossProfitSum, 2),
-            color: "#0084ff",
-          },
-          {
-            label: "毛利率",
-            num: headerData.value.grossProfitMargin + " %",
-            color: "#0084ff",
-          },
-        ],
-      },
     ],
   },
 ]);

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

@@ -11,7 +11,10 @@
         <template #code="{ item }">
           <div style="width: 100%">
             <a style="color: #409eff; cursor: pointer; word-break: break-all" @click="openDetails(item)">{{ item.code }}</a>
-            <svg-icon :icon-class="'afterSales'" style="width:50px;height:30px;position:relative;top:6px" v-if="item.afterSalesId" />
+            <svg-icon :icon-class="'afterSales'" style="width:50px;height:30px;position:relative;top:6px;cursor: pointer;" v-if="item.afterSalesId"
+                      @click="handlePushRoute(item.afterSalesCode)" />
+            <svg-icon :icon-class="'afterSalesOne'" style="width:50px;height:30px;position:relative;top:6px;cursor: pointer;"
+                      v-if="item.isAfterSales ==1" @click="handlePushRoute(item.code)" />
           </div>
         </template>
 
@@ -1179,6 +1182,15 @@ const afterSalesAdd = (row) => {
     },
   });
 };
+
+const handlePushRoute = (code) => {
+  proxy.$router.push({
+    name: "AfterSales",
+    query: {
+      code,
+    },
+  });
+};
 </script>
 
 <style lang="scss" scoped>

+ 189 - 238
src/views/dataBoard/board/salesAnalysis/index.vue

@@ -20,16 +20,8 @@
           </el-radio-group>
         </el-form-item> -->
         <el-form-item>
-          <el-date-picker
-            v-model="queryForm.timeArr"
-            type="daterange"
-            unlink-panels
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            value-format="YYYY-MM-DD"
-            @change="onQuery"
-          />
+          <el-date-picker v-model="queryForm.timeArr" type="daterange" unlink-panels range-separator="-" start-placeholder="开始日期"
+                          end-placeholder="结束日期" value-format="YYYY-MM-DD" @change="onQuery" />
         </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="onQuery">搜索</el-button>
@@ -37,11 +29,7 @@
         </el-form-item>
       </el-form>
     </div>
-    <div
-      class="bck statistics"
-      style="margin-top: 10px"
-      v-loading="statisticsLoading"
-    >
+    <div class="bck statistics" style="margin-top: 10px" v-loading="statisticsLoading">
       <div class="stat-warp">
         <ul>
           <li class="theme1">
@@ -68,40 +56,27 @@
         </ul>
       </div>
     </div>
-    <div
-      class="bck scatter"
-      style="margin-top: 10px"
-      v-loading="scatterLoading"
-    >
+    <div class="bck scatter" style="margin-top: 10px" v-loading="scatterLoading">
       <el-row>
         <el-col :span="8">
           <TitleInfo :content="titleList[0]"></TitleInfo>
           <div ref="echartDom" style="height: 40vh"></div>
         </el-col>
         <el-col :span="16">
-          <byTable
-            :hideSearch="true"
-            :tableHeight="tableHeight"
-            :source="sourceList.scatterData"
-            :pagination="sourceList.scatterPagination"
-            :config="scatterConfig"
-            :loading="scatterLoading"
-            highlight-current-row
-            :hidePagination="true"
-            :selectConfig="[]"
-          >
-          <template #flag="{ item }">
-          <div>
-            <div>
-              <svg class="icon" aria-hidden="true">
-                  <use :xlink:href="'#' + item.countryIcon"></use>
-              </svg>
-              
-              {{ item.countryName }}
-            </div>
-            
-          </div>
-        </template>
+          <byTable :hideSearch="true" :tableHeight="tableHeight" :source="sourceList.scatterData" :pagination="sourceList.scatterPagination"
+                   :config="scatterConfig" :loading="scatterLoading" highlight-current-row :hidePagination="true" :selectConfig="[]">
+            <template #flag="{ item }">
+              <div>
+                <div>
+                  <svg class="icon" aria-hidden="true">
+                    <use :xlink:href="'#' + item.countryIcon"></use>
+                  </svg>
+
+                  {{ item.countryName }}
+                </div>
+
+              </div>
+            </template>
           </byTable>
         </el-col>
       </el-row>
@@ -112,16 +87,8 @@
           <TitleInfo :content="titleList[1]"></TitleInfo>
           <div ref="echartDomOne" style="height: 30vh"></div>
           <div style="margin-top: 10px">
-            <byTable
-              :hideSearch="true"
-              :tableHeight="300"
-              :source="sourceList.salesData"
-              :pagination="sourceList.salesPagination"
-              :config="salesConfig"
-              :loading="salesLoading"
-              highlight-current-row
-              :selectConfig="[]"
-            >
+            <byTable :hideSearch="true" :tableHeight="300" :source="sourceList.salesData" :pagination="sourceList.salesPagination"
+                     :config="salesConfig" :loading="salesLoading" highlight-current-row :selectConfig="[]">
             </byTable>
           </div>
         </el-col>
@@ -130,16 +97,8 @@
             <TitleInfo :content="titleList[2]"></TitleInfo>
             <div ref="echartDomTwo" style="height: 30vh"></div>
             <div style="margin-top: 10px">
-              <byTable
-                :hideSearch="true"
-                :tableHeight="300"
-                :source="sourceList.salesmanSalesData"
-                :pagination="sourceList.salesmanSalesPagination"
-                :config="salesmanSalesConfig"
-                :loading="salesmanSalesLoading"
-                highlight-current-row
-                :selectConfig="[]"
-              >
+              <byTable :hideSearch="true" :tableHeight="300" :source="sourceList.salesmanSalesData" :pagination="sourceList.salesmanSalesPagination"
+                       :config="salesmanSalesConfig" :loading="salesmanSalesLoading" highlight-current-row :selectConfig="[]">
               </byTable>
             </div>
           </div>
@@ -153,16 +112,9 @@
           <TitleInfo :content="titleList[3]"></TitleInfo>
           <div ref="echartDomThree" style="height: 30vh"></div>
           <div style="margin-top: 10px">
-            <byTable
-              :hideSearch="true"
-              :tableHeight="300"
-              :source="sourceList.productSalesVolumeData"
-              :pagination="sourceList.productSalesVolumePagination"
-              :config="productSalesConfig"
-              :loading="productSalesLoading"
-              highlight-current-row
-              :selectConfig="[]"
-            >
+            <byTable :hideSearch="true" :tableHeight="300" :source="sourceList.productSalesVolumeData"
+                     :pagination="sourceList.productSalesVolumePagination" :config="productSalesConfig" :loading="productSalesLoading"
+                     highlight-current-row :selectConfig="[]">
             </byTable>
           </div>
         </el-col>
@@ -171,16 +123,9 @@
             <TitleInfo :content="titleList[4]"></TitleInfo>
             <div ref="echartDomFour" style="height: 30vh"></div>
             <div style="margin-top: 10px">
-              <byTable
-                :hideSearch="true"
-                :tableHeight="300"
-                :source="sourceList.productSalesVolumeOneData"
-                :pagination="sourceList.productSalesVolumeOnePagination"
-                :config="productSalesOneConfig"
-                :loading="productSalesOneLoading"
-                highlight-current-row
-                :selectConfig="[]"
-              >
+              <byTable :hideSearch="true" :tableHeight="300" :source="sourceList.productSalesVolumeOneData"
+                       :pagination="sourceList.productSalesVolumeOnePagination" :config="productSalesOneConfig" :loading="productSalesOneLoading"
+                       highlight-current-row :selectConfig="[]">
               </byTable>
             </div>
           </div>
@@ -360,10 +305,16 @@ const scatterConfig = computed(() => {
         align: "center",
       },
     },
+    // {
+    //   attrs: {
+    //     label: "国旗",
+    //     slot: "flag",
+    //   },
+    // },
     {
       attrs: {
-        label: "国旗",
-        slot: "flag",
+        label: "国",
+        prop: "countryName",
       },
     },
     {
@@ -465,7 +416,7 @@ const productSalesConfig = computed(() => {
   ];
 });
 const tableHeight = computed(() => {
-  return document.documentElement.clientHeight / 10 * 4;
+  return (document.documentElement.clientHeight / 10) * 4;
 });
 
 const productSalesOneConfig = computed(() => {
@@ -513,8 +464,8 @@ const getData = () => {
     //根据amount字段从大到小
     res.sort((a, b) => b.amount - a.amount);
     //截取前十条
-    if(res.length > 10) res = res.slice(0, 10);
-    
+    if (res.length > 10) res = res.slice(0, 10);
+
     optionOne.data.series[0].data = res.map((x) => ({
       value: x.amount,
       name: x.countryName,
@@ -615,12 +566,15 @@ onMounted(() => {
   window.addEventListener("resize", () => {
     myChartFour.resize();
   });
-  
+
   let endData = new Date();
   let beginDate = new Date();
   beginDate.setMonth(0);
   beginDate.setDate(1);
-  queryForm.timeArr = [proxy.parseTime(beginDate, "{y}-{m}-{d}"), proxy.parseTime(endData, "{y}-{m}-{d}")];
+  queryForm.timeArr = [
+    proxy.parseTime(beginDate, "{y}-{m}-{d}"),
+    proxy.parseTime(endData, "{y}-{m}-{d}"),
+  ];
   onQuery();
 });
 </script>
@@ -692,154 +646,151 @@ onMounted(() => {
   }
 }
 .stat-warp {
-		background: #fff;
-		padding: 20px;
-		overflow: hidden;
-		position: relative;
-		border-radius: 5px;
-		
-		.title {
-			height: 60px;
-			select {
-				height: 60px;
-				border: none;
-				outline: none;
-				-webkit-appearance: none;
-				appearance: none;
-				font-size: 14px;
-				font-weight: bold;
-				background: url('@/assets/images/sanjiao.png') no-repeat right
-					center;
-				padding-right: 20px;
-			}
-			div {
-				height: 60px;
-				font-size: 14px;
-				font-weight: bold;
-				line-height: 60px;
-			}
-		}
-		ul {
-			padding: 0;
-			overflow: hidden;
-			margin: 0;
-			li {
-				list-style: none;
-				min-width: 285px;
-				box-sizing: border-box;
-				margin-right: 20px;
-				background: linear-gradient(360deg, #C7E3FE 0%, #DFECFF 100%);
-				float: left;
-				overflow: hidden;
-				padding: 20px;
-				color: #333333;
-				position: relative;
-				border-radius: 10px;
-				cursor: pointer;
-				.label {
-					font-size: 14px;
-					margin-top: 10px;
-				}
-				.label::before {
-					// width: 10px;
-					// height: 10px;
-					// content: '';
-					// border-radius: 50%;
-					// background: #0084ff;
-					// display: inline-block;
-					// margin-right: 10px;
-					
-				}
-				.num {
-					
-					font-size: 24px;
-					font-weight: bold;
-				}
-				.icon-box{
-					position: absolute;
-					height: 40px;
-					width: 40px;
-					right: 20px;
-					top: 20px;
-					background: #fff;
-					border-radius: 10px;
-					text-align: center;
-					line-height: 40px;
-					i{
-						font-size: 20px;
-						color:#0084FF;
-					}
-				}
-			}
-			//#F5F3FF #9E64ED
-			.theme2 {
-				background: linear-gradient(180deg, #EAE8FB 0%, #DED9FF 100%);
-				.label::before {
-					background: #7566F0;
-				}
-				.icon-box i {
-					color: #7566F0;
-				}
-			}
-			//#FFF1E1 #FF9315
-			.theme3 {
-				background: #fff1e1;
-				.label::before {
-					background: #ff9315;
-				}
-				.icon-box i {
-					color: #FF9315;
-				}
-			}
-			//#E2FBE8 #39C55A
-			.theme4 {
-				background: #e2fbe8;
-				.label::before {
-					background: #39c55a;
-				}
-			}
-			.theme5 {
-				background: #ffebe9;
-				.label::before {
-					background: #f94539;
-				}
-			}
-			.theme6 {
-				background: #e4f9f9;
-				.label::before {
-					background: #53cbcb;
-				}
-			}
-			.multi-data {
-				.label::before {
-					display: none;
-				}
-				.label {
-					font-size: 14px;
-					font-weight: bold;
-					color: #333;
-					margin-bottom: 8px;
-				}
-				.num-warp {
-					overflow: hidden;
-					.num-box {
-						float: left;
-						min-width: 80px;
-						margin-right: 20px;
-						.num-small {
-							font-size: 16px;
-							font-weight: bold;
-							margin-bottom: 8px;
-						}
-						.label-small {
-							color: #666;
-							font-size: 14px;
-						}
-					}
-				}
-			}
-		}
-	}
+  background: #fff;
+  padding: 20px;
+  overflow: hidden;
+  position: relative;
+  border-radius: 5px;
+
+  .title {
+    height: 60px;
+    select {
+      height: 60px;
+      border: none;
+      outline: none;
+      -webkit-appearance: none;
+      appearance: none;
+      font-size: 14px;
+      font-weight: bold;
+      background: url("@/assets/images/sanjiao.png") no-repeat right center;
+      padding-right: 20px;
+    }
+    div {
+      height: 60px;
+      font-size: 14px;
+      font-weight: bold;
+      line-height: 60px;
+    }
+  }
+  ul {
+    padding: 0;
+    overflow: hidden;
+    margin: 0;
+    li {
+      list-style: none;
+      min-width: 285px;
+      box-sizing: border-box;
+      margin-right: 20px;
+      background: linear-gradient(360deg, #c7e3fe 0%, #dfecff 100%);
+      float: left;
+      overflow: hidden;
+      padding: 20px;
+      color: #333333;
+      position: relative;
+      border-radius: 10px;
+      cursor: pointer;
+      .label {
+        font-size: 14px;
+        margin-top: 10px;
+      }
+      .label::before {
+        // width: 10px;
+        // height: 10px;
+        // content: '';
+        // border-radius: 50%;
+        // background: #0084ff;
+        // display: inline-block;
+        // margin-right: 10px;
+      }
+      .num {
+        font-size: 24px;
+        font-weight: bold;
+      }
+      .icon-box {
+        position: absolute;
+        height: 40px;
+        width: 40px;
+        right: 20px;
+        top: 20px;
+        background: #fff;
+        border-radius: 10px;
+        text-align: center;
+        line-height: 40px;
+        i {
+          font-size: 20px;
+          color: #0084ff;
+        }
+      }
+    }
+    //#F5F3FF #9E64ED
+    .theme2 {
+      background: linear-gradient(180deg, #eae8fb 0%, #ded9ff 100%);
+      .label::before {
+        background: #7566f0;
+      }
+      .icon-box i {
+        color: #7566f0;
+      }
+    }
+    //#FFF1E1 #FF9315
+    .theme3 {
+      background: #fff1e1;
+      .label::before {
+        background: #ff9315;
+      }
+      .icon-box i {
+        color: #ff9315;
+      }
+    }
+    //#E2FBE8 #39C55A
+    .theme4 {
+      background: #e2fbe8;
+      .label::before {
+        background: #39c55a;
+      }
+    }
+    .theme5 {
+      background: #ffebe9;
+      .label::before {
+        background: #f94539;
+      }
+    }
+    .theme6 {
+      background: #e4f9f9;
+      .label::before {
+        background: #53cbcb;
+      }
+    }
+    .multi-data {
+      .label::before {
+        display: none;
+      }
+      .label {
+        font-size: 14px;
+        font-weight: bold;
+        color: #333;
+        margin-bottom: 8px;
+      }
+      .num-warp {
+        overflow: hidden;
+        .num-box {
+          float: left;
+          min-width: 80px;
+          margin-right: 20px;
+          .num-small {
+            font-size: 16px;
+            font-weight: bold;
+            margin-bottom: 8px;
+          }
+          .label-small {
+            color: #666;
+            font-size: 14px;
+          }
+        }
+      }
+    }
+  }
+}
 // .scatter {
 //   display: flex;
 // }

+ 1 - 1
src/views/process/processApproval/index.vue

@@ -118,7 +118,7 @@
           <div style="overflow: auto; height: calc(100vh - 200px)">
             <div style="padding-bottom:50px" v-if="showChart">
               <div style="margin-bottom:10px;">
-                <TitleInfo :content="'利润预算波动'"></TitleInfo>
+                <TitleInfo :content="'利润走势图'"></TitleInfo>
               </div>
               <div ref="chartDom" style="height:150px"></div>
             </div>

+ 23 - 4
src/views/salesMange/afterSales/index.vue

@@ -15,13 +15,19 @@
 
         <template #code="{ item }">
           <div style="width:100%">
-            <span class="el-click" style="cursor:pointer;color:#409EFF" @click="getDtl(item)">{{item.code}}</span>
+            <span style="cursor:pointer;color:#409EFF" @click="getDtl(item)">{{item.code}}</span>
+          </div>
+        </template>
+
+        <template #contractCode="{ item }">
+          <div style="width:100%">
+            <span style="cursor:pointer;color:#409EFF" @click="getDtl(item,true)">{{item.contractCode}}</span>
           </div>
         </template>
 
         <template #newCode="{ item }">
           <div style="width:100%">
-            <span class="el-click" style="cursor:pointer;color:#409EFF" @click="openDetails(item)">{{item.newContractCode}}</span>
+            <span style="cursor:pointer;color:#409EFF" @click="openDetails(item)">{{item.newContractCode}}</span>
           </div>
         </template>
 
@@ -205,6 +211,7 @@ import byForm from "@/components/byForm/index";
 import SelectContractProduct from "@/views/salesMange/afterSales/SelectContractProduct.vue";
 import $bus from "@/bus/index.js";
 import { reactive } from "vue";
+const route = useRoute();
 
 const { proxy } = getCurrentInstance();
 const loading = ref(false);
@@ -300,7 +307,7 @@ const config = computed(() => {
     {
       attrs: {
         label: "源销售订单",
-        prop: "contractCode",
+        slot: "contractCode",
         width: 150,
         fixed: "left",
       },
@@ -682,6 +689,9 @@ const getDict = () => {
     });
 };
 getDict();
+if (route.query.code) {
+  sourceList.value.pagination.keyword = route.query.code;
+}
 getList();
 const clickAdd = (type) => {
   // formOption.disabled = false;
@@ -730,7 +740,16 @@ const handleSelect = (row) => {
   proxy.msgTip("选择成功");
 };
 
-const getDtl = (row) => {
+const getDtl = (row, flag = false) => {
+  if (flag) {
+    proxy.$router.push({
+      name: "contractDetails",
+      query: {
+        currentContractId: row.contractId,
+      },
+    });
+    return;
+  }
   proxy.$router.push({
     path: "/platform_manage/process/processApproval",
     query: {

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác