Przeglądaj źródła

销售反馈更改

qinhb 2 tygodni temu
rodzic
commit
efd1fbb654

+ 1 - 1
.env.development

@@ -10,7 +10,7 @@ VITE_APP_BASE_API = '/dev-api'
 # 上传文件接口地址
 VITE_APP_UPLOAD_URL = 'http://192.168.101.4:7105'
 # 开发接口地址
- VITE_APP_API_URL = 'http://192.168.101.4:7105'
+ VITE_APP_API_URL = 'http://127.0.0.1:7105'
 
 
 # 是否启用 Mock 服务

+ 8 - 0
src/api/user/index.ts

@@ -138,3 +138,11 @@ export function importUser(deptId: number, file: File) {
     },
   });
 }
+
+
+export function getUserTree(): AxiosPromise {
+  return request({
+    url: "/api/v1/syn/user/info/tree",
+    method: "get",
+  });
+}

+ 2 - 1
src/plugins/permission.ts

@@ -9,12 +9,13 @@ import { getUserDicts } from "@/api/auth";
 export function setupPermission() {
   // 白名单路由
   const whiteList = [""];
-
+  const userStore = useUserStore();
   router.beforeEach(async (to, from, next) => {
     NProgress.start();
     isNewVersion();
     const hasToken = localStorage.getItem("token");
     if (hasToken) {
+      await userStore.getUserInfo();
       if (to.path === "/login") {
         // 如果已登录,跳转首页
         next({ path: "/" });

+ 2 - 1
src/views/login/index.vue

@@ -200,7 +200,8 @@ function handleLogin() {
       loading.value = true;
       userStore
         .login(loginData.value)
-        .then(async () => {
+        .then(async (res) => {
+          localStorage.setItem("token", res.data + "");
           const query: LocationQuery = route.query;
           const redirect = (query.redirect as LocationQueryValue) ?? "/";
           const otherQueryParams = Object.keys(query).reduce(

+ 22 - 6
src/views/sales/DetailCom.vue

@@ -2,21 +2,34 @@
   <div>
     <div class="sale-header">销售信息反馈表</div>
     <table border-collapse="collapse">
-      <thead>
         <tr>
           <th>顾客名称</th>
           <th>详细地址</th>
           <th>联系人</th>
           <th>联系电话</th>
         </tr>
-      </thead>
-      <tbody>
         <tr>
           <td>{{ saleModel.customer }}</td>
           <td>{{ saleModel.address }}</td>
           <td>{{ saleModel.contacts }}</td>
           <td>{{ saleModel.phoneNo }}</td>
         </tr>
+        <tr>
+          <th>产品型号</th>
+          <th>产品分类</th>
+          <th>检验批号</th>
+          <th>数量</th>
+        </tr>
+        <tr>
+          <td>{{ saleModel.materialModel }}</td>
+          <td>{{ saleModel.type }}</td>
+          <td>{{ saleModel.workOrderCode }}</td>
+          <td>{{ saleModel.num }}</td>
+        </tr>
+      <tr>
+        <th>产品编号</th>
+        <th colspan="3" style="font-weight: normal;">{{ saleModel.seqs }}</th>
+      </tr>
         <tr v-for="(item, index) in contentArray" :key="index">
           <td colspan="4">
             <div class="sale-box">
@@ -25,13 +38,12 @@
                 {{ item.content }}
               </div>
               <div class="sale-bottom">
-                <div class="desc">处理人:{{ item[`user${index + 1}`] }}</div>
+                <div class="desc">处理人:{{ item[`user`] }}</div>
                 <div class="desc">时间: {{ item.time }}</div>
               </div>
             </div>
           </td>
         </tr>
-      </tbody>
     </table>
   </div>
 </template>
@@ -69,6 +81,10 @@ const refreshView = (row) => {
     let remark6 = JSON.parse(row.remark6);
     contentArray.value.push({ ...remark6, title: "处置情况反馈意见" });
   }
+  if (row.remark7 && JSON.parse(row.remark7).content) {
+    let remark7 = JSON.parse(row.remark7);
+    contentArray.value.push({ ...remark7, title: "处置情况反馈意见" });
+  }
 };
 
 defineExpose({ refreshView });
@@ -78,7 +94,7 @@ defineExpose({ refreshView });
 .sale-header {
   text-align: center;
   font-size: 20px;
-  font-weight: bold;
+  //font-weight: bold;
   margin-bottom: 10px;
 }
 table {

+ 57 - 24
src/views/sales/add.vue

@@ -59,9 +59,24 @@
             >
               <el-option
                 v-for="item in seqList"
-                :key="item"
-                :label="item"
-                :value="item"
+                :key="item.label"
+                :label="item.label"
+                :value="item.label"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="产品分类" prop="seqs">
+            <el-select
+                v-model="saleForm.type"
+                value-key="value"
+                placeholder="请选择产品分类"
+                style="width: 100%"
+            >
+              <el-option
+                  v-for="item in typeList"
+                  :key="item.value"
+                  :label="item.value"
+                  :value="item.value"
               />
             </el-select>
           </el-form-item>
@@ -78,7 +93,7 @@
             <el-input v-model="remark1.content" type="textarea" />
           </el-form-item>
           <el-form-item label="填表人" prop="user">
-            <el-select
+<!--            <el-select
               v-model="remark1.user"
               placeholder="请选择"
               style="width: 100%"
@@ -89,12 +104,18 @@
                 :label="item.userName"
                 :value="item.userName"
               />
-            </el-select>
+            </el-select>-->
+            <el-tree-select
+                v-model="remark1.user"
+                :data="userList"
+                filterable
+            />
           </el-form-item>
           <el-form-item label="日期" prop="time">
             <el-date-picker
               v-model="remark1.time"
               type="date"
+              :disabled-date="disabledDate"
               placeholder="请选择日期"
               clearable
               format="YYYY年MM月DD日"
@@ -103,18 +124,11 @@
             />
           </el-form-item>
           <el-form-item label="下一步处理人" prop="nextRemarkUser">
-            <el-select
-              v-model="remark1.nextRemarkUser"
-              placeholder="请选择处理人"
-              style="width: 100%"
-            >
-              <el-option
-                v-for="item in userList"
-                :key="item.userName"
-                :label="item.userName"
-                :value="item.userName"
-              />
-            </el-select>
+            <el-tree-select
+                v-model="remark1.nextRemarkUser"
+                :data="userList"
+                filterable
+            />
           </el-form-item>
         </el-form>
       </template>
@@ -130,9 +144,14 @@
 
 <script setup>
 import { addFeedback, getOrderList, getUserList } from "@/api/sales/index";
-
+import { getUserTree } from "@/api/user/index";
 const drawerVisible = ref(false);
-
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
 const baseInfoRef = ref(null);
 const saleForm = reactive({
   customer: "",
@@ -189,6 +208,17 @@ const rules1 = {
 
 // 订单相关信息
 const orders = ref([]);
+const typeList = [
+  {"value": "单管成品率"},
+  {"value": "单片成品率"},
+  {"value": "厚膜混合电路前工序成品率"},
+  {"value": "厚膜混合电路后工序成品率"},
+  {"value": "模块电路成品率"},
+  {"value": "电力电子器件成品率"},
+  {"value": "混合集成电路外壳(玻璃绝缘子)成品率"},
+  {"value": "混合集成电路外壳(陶瓷绝缘子)成品率"},
+  {"value": "5年内每年各类产品成品率提高"},
+]
 const selectedOrder = ref({});
 const selectOrderCode = ref("");
 const getOrders = async () => {
@@ -204,7 +234,7 @@ const getOrders = async () => {
 };
 const orderSelect = (value) => {
   selectedOrder.value = value;
-  seqList.value = selectedOrder.value.seqs;
+  seqList.value = selectedOrder.value.seqs.map((item, index) => ({ value: item, label: item }));
   saleForm.seqs = [];
 };
 
@@ -214,11 +244,14 @@ const seqList = ref([]);
 const userInfo = ref({});
 const userList = ref([]);
 const getUserInfo = async () => {
-  const res = await getUserList();
-  userList.value = res.data;
+  //const res = await getUserList();
+  //userList.value = res.data;
   // if (userList.value.length > 0) {
   //   userInfo.value = userList.value[0];
   // }
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
 };
 
 const showDrawer = () => {
@@ -261,7 +294,7 @@ const confirmClick = () => {
     if (valid) {
       let remark1Copy = {
         content: remark1.content,
-        user1: remark1.user,
+        user: remark1.user,
         time: remark1.time,
       };
       let remark2 = {
@@ -277,7 +310,7 @@ const confirmClick = () => {
         remark2: JSON.stringify(remark2),
       };
 
-      p.seqs = p.seqs.join(",");
+      p.seqs = saleForm.seqs.join(",");
 
       addFeedback(p).then(() => {
         feedBackEmit("finish");

+ 21 - 36
src/views/sales/handle2.vue

@@ -18,24 +18,11 @@
           :autosize="{ minRows: 3, maxRows: 6 }"
         />
       </el-form-item>
-      <el-form-item label="填表人" prop="user">
-        <el-select
-          v-model="remark.user"
-          placeholder="请选择"
-          style="width: 100%"
-        >
-          <el-option
-            v-for="item in userList"
-            :key="item.userName"
-            :label="item.userName"
-            :value="item.userName"
-          />
-        </el-select>
-      </el-form-item>
       <el-form-item label="日期" prop="time">
         <el-date-picker
           v-model="remark.time"
           type="date"
+          :disabled-date="disabledDate"
           placeholder="请选择日期"
           clearable
           format="YYYY年MM月DD日"
@@ -44,18 +31,11 @@
         />
       </el-form-item>
       <el-form-item label="下一步处理人" prop="nextRemarkUser">
-        <el-select
-          v-model="remark.nextRemarkUser"
-          placeholder="请选择处理人"
-          style="width: 100%"
-        >
-          <el-option
-            v-for="item in userList"
-            :key="item.userName"
-            :label="item.userName"
-            :value="item.userName"
-          />
-        </el-select>
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
+        />
       </el-form-item>
       <el-form-item label="是否通过" prop="state">
         <el-radio-group v-model="remark.state">
@@ -77,11 +57,12 @@
 <script setup>
 import DetailCom from "@/views/sales/DetailCom.vue";
 import { dealFeedback, getUserList } from "@/api/sales/index";
-
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
 const drawerVisible = ref(false);
 const detailComRef = ref(null);
 const saleModel = ref({});
-
+const userStore = useUserStore();
 const showDrawer = (row) => {
   drawerVisible.value = true;
   saleModel.value = row;
@@ -92,7 +73,12 @@ const showDrawer = (row) => {
 
   getUserInfo();
 };
-
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
 const rules1 = {
   content: [
     { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
@@ -133,25 +119,24 @@ const feedBackEmit = defineEmits(["finish"]);
 const userInfo = ref({});
 const userList = ref([]);
 const getUserInfo = async () => {
-  const res = await getUserList();
-  userList.value = res.data;
-  // if (userList.value.length > 0) {
-  //   userInfo.value = userList.value[0];
-  // }
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
 };
 
 const confirmClick = () => {
+  remark.user = userStore.user.username;
   remarkRef.value.validate((valid) => {
     if (valid) {
       let remark2Copy = {
         content: remark.content,
-        user2: remark.user,
+        user: remark.user,
         time: remark.time,
         state: remark.state,
       };
       let remark3 = {
         content: "",
-        user3: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
         time: "",
       };
 

+ 198 - 0
src/views/sales/handle3.vue

@@ -0,0 +1,198 @@
+<template>
+  <el-drawer v-model="drawerVisible" size="1000">
+    <div>
+      <DetailCom ref="detailComRef"></DetailCom>
+    </div>
+
+    <el-form
+      ref="remarkRef"
+      :model="remark"
+      label-width="150"
+      :rules="rules1"
+      style="max-width: 600px; margin-left: 80px; margin-top: 20px"
+    >
+      <el-form-item label="原因分析" prop="content">
+        <el-input
+          v-model="remark.content"
+          type="textarea"
+          :autosize="{ minRows: 3, maxRows: 6 }"
+        />
+      </el-form-item>
+<!--      <el-form-item label="填表人" prop="user">
+        <el-select
+          v-model="remark.user"
+          placeholder="请选择"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in userList"
+            :key="item.userName"
+            :label="item.userName"
+            :value="item.userName"
+          />
+        </el-select>
+      </el-form-item>-->
+      <el-form-item label="日期" prop="time">
+        <el-date-picker
+          v-model="remark.time"
+          type="date"
+          :disabled-date="disabledDate"
+          placeholder="请选择日期"
+          clearable
+          format="YYYY年MM月DD日"
+          value-format="YYYY年MM月DD日"
+          style="width: 100%"
+        />
+      </el-form-item>
+      <el-form-item label="下一步处理人" prop="nextRemarkUser">
+<!--        <el-select
+          v-model="remark.nextRemarkUser"
+          placeholder="请选择处理人"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="item in userList"
+            :key="item.userName"
+            :label="item.userName"
+            :value="item.userName"
+          />
+        </el-select>-->
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
+        />
+      </el-form-item>
+      <el-form-item label="是否通过" prop="state">
+        <el-radio-group v-model="remark.state">
+          <el-radio :value="0">同意</el-radio>
+          <el-radio :value="1">不同意</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="drawer-bottom">
+        <el-button @click="cancelClick">取消</el-button>
+        <el-button type="primary" @click="confirmClick">提交</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<script setup>
+import DetailCom from "@/views/sales/DetailCom.vue";
+import { dealFeedback, getUserList } from "@/api/sales/index";
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+const userStore = useUserStore();
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
+const showDrawer = (row) => {
+  drawerVisible.value = true;
+  saleModel.value = row;
+
+  nextTick(() => {
+    detailComRef.value && detailComRef.value.refreshView(row);
+  });
+
+  getUserInfo();
+};
+
+const rules1 = {
+  content: [
+    { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
+    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+  ],
+  user: [
+    { required: true, message: "请输入姓名", trigger: "blur" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+  time: [{ required: true, message: "请选择日期", trigger: "change" }],
+  nextRemarkUser: [
+    { required: true, message: "请选择处理人", trigger: "change" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+};
+
+defineExpose({ showDrawer });
+
+const remarkRef = ref(null);
+
+const remark = reactive({
+  content: "",
+  user: "",
+  time: "",
+  nextRemarkUser: "",
+  state: 1,
+});
+
+const cancelClick = () => {
+  drawerVisible.value = false;
+
+  remarkRef.value.resetFields();
+};
+
+const feedBackEmit = defineEmits(["finish"]);
+
+// 用户信息
+const userInfo = ref({});
+const userList = ref([]);
+const getUserInfo = async () => {
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
+};
+
+const confirmClick = () => {
+  remark.user = userStore.user.username;
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark2Copy = {
+        content: remark.content,
+        user: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+      let remark3 = {
+        content: "",
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        time: "",
+      };
+
+      let p = {
+        id: saleModel.value.id,
+        remark3: JSON.stringify(remark2Copy),
+        remark4: JSON.stringify(remark3),
+        step: 3, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+      };
+
+      dealFeedback(p).then(() => {
+        feedBackEmit("finish");
+        cancelClick();
+      });
+    } else {
+      console.log("remarkRef invalid");
+      return false;
+    }
+  });
+};
+</script>
+
+<style scoped lang="scss">
+@media print {
+  #print {
+    position: absolute; /* 或 absolute, fixed, 根据需要调整 */
+    top: 20px; /* 调整顶部位置 */
+    margin: 0; /* 重置边距 */
+    width: 1000px;
+  }
+}
+</style>

+ 198 - 0
src/views/sales/handle4.vue

@@ -0,0 +1,198 @@
+<template>
+  <el-drawer v-model="drawerVisible" size="1000">
+    <div>
+      <DetailCom ref="detailComRef"></DetailCom>
+    </div>
+
+    <el-form
+        ref="remarkRef"
+        :model="remark"
+        label-width="150"
+        :rules="rules1"
+        style="max-width: 600px; margin-left: 80px; margin-top: 20px"
+    >
+      <el-form-item label="整改及纠正措施" prop="content">
+        <el-input
+            v-model="remark.content"
+            type="textarea"
+            :autosize="{ minRows: 3, maxRows: 6 }"
+        />
+      </el-form-item>
+      <!--      <el-form-item label="填表人" prop="user">
+              <el-select
+                v-model="remark.user"
+                placeholder="请选择"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userName"
+                  :label="item.userName"
+                  :value="item.userName"
+                />
+              </el-select>
+            </el-form-item>-->
+      <el-form-item label="日期" prop="time">
+        <el-date-picker
+            v-model="remark.time"
+            type="date"
+            placeholder="请选择日期"
+            clearable
+            :disabled-date="disabledDate"
+            format="YYYY年MM月DD日"
+            value-format="YYYY年MM月DD日"
+            style="width: 100%"
+        />
+      </el-form-item>
+      <el-form-item label="下一步处理人" prop="nextRemarkUser">
+        <!--        <el-select
+                  v-model="remark.nextRemarkUser"
+                  placeholder="请选择处理人"
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="item in userList"
+                    :key="item.userName"
+                    :label="item.userName"
+                    :value="item.userName"
+                  />
+                </el-select>-->
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
+        />
+      </el-form-item>
+      <el-form-item label="是否通过" prop="state">
+        <el-radio-group v-model="remark.state">
+          <el-radio :value="0">同意</el-radio>
+          <el-radio :value="1">不同意</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="drawer-bottom">
+        <el-button @click="cancelClick">取消</el-button>
+        <el-button type="primary" @click="confirmClick">提交</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<script setup>
+import DetailCom from "@/views/sales/DetailCom.vue";
+import { dealFeedback, getUserList } from "@/api/sales/index";
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+const userStore = useUserStore();
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
+const showDrawer = (row) => {
+  drawerVisible.value = true;
+  saleModel.value = row;
+
+  nextTick(() => {
+    detailComRef.value && detailComRef.value.refreshView(row);
+  });
+
+  getUserInfo();
+};
+
+const rules1 = {
+  content: [
+    { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
+    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+  ],
+  user: [
+    { required: true, message: "请输入姓名", trigger: "blur" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+  time: [{ required: true, message: "请选择日期", trigger: "change" }],
+  nextRemarkUser: [
+    { required: true, message: "请选择处理人", trigger: "change" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+};
+
+defineExpose({ showDrawer });
+
+const remarkRef = ref(null);
+
+const remark = reactive({
+  content: "",
+  user: "",
+  time: "",
+  nextRemarkUser: "",
+  state: 1,
+});
+
+const cancelClick = () => {
+  drawerVisible.value = false;
+
+  remarkRef.value.resetFields();
+};
+
+const feedBackEmit = defineEmits(["finish"]);
+
+// 用户信息
+const userInfo = ref({});
+const userList = ref([]);
+const getUserInfo = async () => {
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
+};
+
+const confirmClick = () => {
+  remark.user = userStore.user.username;
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark2Copy = {
+        content: remark.content,
+        user: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+      let remark3 = {
+        content: "",
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        time: "",
+      };
+
+      let p = {
+        id: saleModel.value.id,
+        remark4: JSON.stringify(remark2Copy),
+        remark5: JSON.stringify(remark3),
+        step: 4, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+      };
+
+      dealFeedback(p).then(() => {
+        feedBackEmit("finish");
+        cancelClick();
+      });
+    } else {
+      console.log("remarkRef invalid");
+      return false;
+    }
+  });
+};
+</script>
+
+<style scoped lang="scss">
+@media print {
+  #print {
+    position: absolute; /* 或 absolute, fixed, 根据需要调整 */
+    top: 20px; /* 调整顶部位置 */
+    margin: 0; /* 重置边距 */
+    width: 1000px;
+  }
+}
+</style>

+ 68 - 56
src/views/sales/handle5.vue

@@ -5,57 +5,63 @@
     </div>
 
     <el-form
-      ref="remarkRef"
-      :model="remark"
-      label-width="150"
-      :rules="rules1"
-      style="max-width: 600px; margin-left: 80px; margin-top: 20px"
+        ref="remarkRef"
+        :model="remark"
+        label-width="150"
+        :rules="rules1"
+        style="max-width: 600px; margin-left: 80px; margin-top: 20px"
     >
       <el-form-item label="整改及纠正措施验证" prop="content">
         <el-input
-          v-model="remark.content"
-          type="textarea"
-          :autosize="{ minRows: 3, maxRows: 6 }"
+            v-model="remark.content"
+            type="textarea"
+            :autosize="{ minRows: 3, maxRows: 6 }"
         />
       </el-form-item>
-      <el-form-item label="填表人" prop="user">
-        <el-select
-          v-model="remark.user"
-          placeholder="请选择"
-          style="width: 100%"
-        >
-          <el-option
-            v-for="item in userList"
-            :key="item.userName"
-            :label="item.userName"
-            :value="item.userName"
-          />
-        </el-select>
-      </el-form-item>
+      <!--      <el-form-item label="填表人" prop="user">
+              <el-select
+                v-model="remark.user"
+                placeholder="请选择"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userName"
+                  :label="item.userName"
+                  :value="item.userName"
+                />
+              </el-select>
+            </el-form-item>-->
       <el-form-item label="日期" prop="time">
         <el-date-picker
-          v-model="remark.time"
-          type="date"
-          placeholder="请选择日期"
-          clearable
-          format="YYYY年MM月DD日"
-          value-format="YYYY年MM月DD日"
-          style="width: 100%"
+            v-model="remark.time"
+            type="date"
+            placeholder="请选择日期"
+            :disabled-date="disabledDate"
+            clearable
+            format="YYYY年MM月DD日"
+            value-format="YYYY年MM月DD日"
+            style="width: 100%"
         />
       </el-form-item>
       <el-form-item label="下一步处理人" prop="nextRemarkUser">
-        <el-select
-          v-model="remark.nextRemarkUser"
-          placeholder="请选择处理人"
-          style="width: 100%"
-        >
-          <el-option
-            v-for="item in userList"
-            :key="item.userName"
-            :label="item.userName"
-            :value="item.userName"
-          />
-        </el-select>
+        <!--        <el-select
+                  v-model="remark.nextRemarkUser"
+                  placeholder="请选择处理人"
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="item in userList"
+                    :key="item.userName"
+                    :label="item.userName"
+                    :value="item.userName"
+                  />
+                </el-select>-->
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
+        />
       </el-form-item>
       <el-form-item label="是否通过" prop="state">
         <el-radio-group v-model="remark.state">
@@ -77,11 +83,18 @@
 <script setup>
 import DetailCom from "@/views/sales/DetailCom.vue";
 import { dealFeedback, getUserList } from "@/api/sales/index";
-
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
 const drawerVisible = ref(false);
 const detailComRef = ref(null);
 const saleModel = ref({});
-
+const userStore = useUserStore();
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
 const showDrawer = (row) => {
   drawerVisible.value = true;
   saleModel.value = row;
@@ -95,7 +108,7 @@ const showDrawer = (row) => {
 
 const rules1 = {
   content: [
-    { required: true, message: "请输入整改及纠正措施验证", trigger: "blur" },
+    { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
     { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
   ],
   user: [
@@ -133,33 +146,32 @@ const feedBackEmit = defineEmits(["finish"]);
 const userInfo = ref({});
 const userList = ref([]);
 const getUserInfo = async () => {
-  const res = await getUserList();
-  userList.value = res.data;
-  // if (userList.value.length > 0) {
-  //   userInfo.value = userList.value[0];
-  // }
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
 };
 
 const confirmClick = () => {
+  remark.user = userStore.user.username;
   remarkRef.value.validate((valid) => {
     if (valid) {
-      let remark5Copy = {
+      let remark2Copy = {
         content: remark.content,
-        user5: remark.user,
+        user: remark.user,
         time: remark.time,
         state: remark.state,
       };
-      let remark6 = {
+      let remark3 = {
         content: "",
-        user6: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
         time: "",
       };
 
       let p = {
         id: saleModel.value.id,
-        remark5: JSON.stringify(remark5Copy),
-        remark6: JSON.stringify(remark6),
-        step: 2, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+        remark5: JSON.stringify(remark2Copy),
+        remark6: JSON.stringify(remark3),
+        step: 5, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
       };
 
       dealFeedback(p).then(() => {

+ 75 - 57
src/views/sales/handle6.vue

@@ -5,58 +5,64 @@
     </div>
 
     <el-form
-      ref="remarkRef"
-      :model="remark"
-      label-width="150"
-      :rules="rules1"
-      style="max-width: 600px; margin-left: 80px; margin-top: 20px"
+        ref="remarkRef"
+        :model="remark"
+        label-width="150"
+        :rules="rules1"
+        style="max-width: 600px; margin-left: 80px; margin-top: 20px"
     >
       <el-form-item label="处置情况的反馈意见" prop="content">
         <el-input
-          v-model="remark.content"
-          type="textarea"
-          :autosize="{ minRows: 3, maxRows: 6 }"
+            v-model="remark.content"
+            type="textarea"
+            :autosize="{ minRows: 3, maxRows: 6 }"
         />
       </el-form-item>
-      <el-form-item label="填表人" prop="user">
-        <el-select
-          v-model="remark.user"
-          placeholder="请选择"
-          style="width: 100%"
-        >
-          <el-option
-            v-for="item in userList"
-            :key="item.userName"
-            :label="item.userName"
-            :value="item.userName"
-          />
-        </el-select>
-      </el-form-item>
+      <!--      <el-form-item label="填表人" prop="user">
+              <el-select
+                v-model="remark.user"
+                placeholder="请选择"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userName"
+                  :label="item.userName"
+                  :value="item.userName"
+                />
+              </el-select>
+            </el-form-item>-->
       <el-form-item label="日期" prop="time">
         <el-date-picker
-          v-model="remark.time"
-          type="date"
-          placeholder="请选择日期"
-          clearable
-          format="YYYY年MM月DD日"
-          value-format="YYYY年MM月DD日"
-          style="width: 100%"
+            v-model="remark.time"
+            type="date"
+            placeholder="请选择日期"
+            clearable
+            :disabled-date="disabledDate"
+            format="YYYY年MM月DD日"
+            value-format="YYYY年MM月DD日"
+            style="width: 100%"
+        />
+      </el-form-item>
+      <el-form-item label="下一步处理人" prop="nextRemarkUser">
+        <!--        <el-select
+                  v-model="remark.nextRemarkUser"
+                  placeholder="请选择处理人"
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="item in userList"
+                    :key="item.userName"
+                    :label="item.userName"
+                    :value="item.userName"
+                  />
+                </el-select>-->
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
         />
       </el-form-item>
-      <!--      <el-form-item label="下一步处理人" prop="nextRemarkUser">-->
-      <!--        <el-select-->
-      <!--          v-model="remark.nextRemarkUser"-->
-      <!--          placeholder="请选择处理人"-->
-      <!--          style="width: 100%"-->
-      <!--        >-->
-      <!--          <el-option-->
-      <!--            v-for="item in userList"-->
-      <!--            :key="item.userName"-->
-      <!--            :label="item.userName"-->
-      <!--            :value="item.userName"-->
-      <!--          />-->
-      <!--        </el-select>-->
-      <!--      </el-form-item>-->
       <el-form-item label="是否通过" prop="state">
         <el-radio-group v-model="remark.state">
           <el-radio :value="0">同意</el-radio>
@@ -77,11 +83,18 @@
 <script setup>
 import DetailCom from "@/views/sales/DetailCom.vue";
 import { dealFeedback, getUserList } from "@/api/sales/index";
-
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
 const drawerVisible = ref(false);
 const detailComRef = ref(null);
 const saleModel = ref({});
-
+const userStore = useUserStore();
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
 const showDrawer = (row) => {
   drawerVisible.value = true;
   saleModel.value = row;
@@ -95,7 +108,7 @@ const showDrawer = (row) => {
 
 const rules1 = {
   content: [
-    { required: true, message: "请输入处置情况的反馈意见", trigger: "blur" },
+    { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
     { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
   ],
   user: [
@@ -117,8 +130,8 @@ const remark = reactive({
   content: "",
   user: "",
   time: "",
-  // nextRemarkUser: "",
-  state: 0,
+  nextRemarkUser: "",
+  state: 1,
 });
 
 const cancelClick = () => {
@@ -133,27 +146,32 @@ const feedBackEmit = defineEmits(["finish"]);
 const userInfo = ref({});
 const userList = ref([]);
 const getUserInfo = async () => {
-  const res = await getUserList();
-  userList.value = res.data;
-  // if (userList.value.length > 0) {
-  //   userInfo.value = userList.value[0];
-  // }
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
 };
 
 const confirmClick = () => {
+  remark.user = userStore.user.username;
   remarkRef.value.validate((valid) => {
     if (valid) {
-      let remark6Copy = {
+      let remark2Copy = {
         content: remark.content,
-        user6: remark.user,
+        user: remark.user,
         time: remark.time,
         state: remark.state,
       };
+      let remark3 = {
+        content: "",
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        time: "",
+      };
 
       let p = {
         id: saleModel.value.id,
-        remark6: JSON.stringify(remark6Copy),
-        step: 3, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+        remark6: JSON.stringify(remark2Copy),
+        remark7: JSON.stringify(remark3),
+        step: 6, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
       };
 
       dealFeedback(p).then(() => {

+ 197 - 0
src/views/sales/handle7.vue

@@ -0,0 +1,197 @@
+<template>
+  <el-drawer v-model="drawerVisible" size="1000">
+    <div>
+      <DetailCom ref="detailComRef"></DetailCom>
+    </div>
+
+    <el-form
+        ref="remarkRef"
+        :model="remark"
+        label-width="150"
+        :rules="rules1"
+        style="max-width: 600px; margin-left: 80px; margin-top: 20px"
+    >
+      <el-form-item label="处置情况的反馈意见" prop="content">
+        <el-input
+            v-model="remark.content"
+            type="textarea"
+            :autosize="{ minRows: 3, maxRows: 6 }"
+        />
+      </el-form-item>
+      <!--      <el-form-item label="填表人" prop="user">
+              <el-select
+                v-model="remark.user"
+                placeholder="请选择"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userName"
+                  :label="item.userName"
+                  :value="item.userName"
+                />
+              </el-select>
+            </el-form-item>-->
+      <el-form-item label="日期" prop="time">
+        <el-date-picker
+            v-model="remark.time"
+            type="date"
+            placeholder="请选择日期"
+            clearable
+            :disabled-date="disabledDate"
+            format="YYYY年MM月DD日"
+            value-format="YYYY年MM月DD日"
+            style="width: 100%"
+        />
+      </el-form-item>
+<!--      <el-form-item label="下一步处理人" prop="nextRemarkUser">
+        &lt;!&ndash;        <el-select
+                  v-model="remark.nextRemarkUser"
+                  placeholder="请选择处理人"
+                  style="width: 100%"
+                >
+                  <el-option
+                    v-for="item in userList"
+                    :key="item.userName"
+                    :label="item.userName"
+                    :value="item.userName"
+                  />
+                </el-select>&ndash;&gt;
+        <el-tree-select
+            v-model="remark.nextRemarkUser"
+            :data="userList"
+            filterable
+        />
+      </el-form-item>-->
+      <el-form-item label="是否通过" prop="state">
+        <el-radio-group v-model="remark.state">
+          <el-radio :value="0">同意</el-radio>
+          <el-radio :value="1">不同意</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="drawer-bottom">
+        <el-button @click="cancelClick">取消</el-button>
+        <el-button type="primary" @click="confirmClick">提交</el-button>
+      </div>
+    </template>
+  </el-drawer>
+</template>
+
+<script setup>
+import DetailCom from "@/views/sales/DetailCom.vue";
+import { dealFeedback, getUserList } from "@/api/sales/index";
+import { getUserTree } from "@/api/user/index";
+import {useUserStore} from "@/store";
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+const userStore = useUserStore();
+const disabledDate = (time)=> {
+  //选择今天以及今天之后的日期
+  return time.getTime() < Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择
+  //选择今天以及今天之前的日期
+  //return time.getTime() > Date.now() - 8.64e7;//如果没有后面的-8.64e7就是不可以选择今天的
+}
+const showDrawer = (row) => {
+  drawerVisible.value = true;
+  saleModel.value = row;
+
+  nextTick(() => {
+    detailComRef.value && detailComRef.value.refreshView(row);
+  });
+
+  getUserInfo();
+};
+
+const rules1 = {
+  content: [
+    { required: true, message: "请输入投诉或建议处置意见", trigger: "blur" },
+    { min: 2, max: 200, message: "长度在 2 到 200 个字符", trigger: "blur" },
+  ],
+  user: [
+    { required: true, message: "请输入姓名", trigger: "blur" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+  time: [{ required: true, message: "请选择日期", trigger: "change" }],
+  nextRemarkUser: [
+    { required: true, message: "请选择处理人", trigger: "change" },
+    { min: 2, max: 20, message: "长度在 2 到 20 个字符", trigger: "blur" },
+  ],
+};
+
+defineExpose({ showDrawer });
+
+const remarkRef = ref(null);
+
+const remark = reactive({
+  content: "",
+  user: "",
+  time: "",
+  nextRemarkUser: "",
+  state: 1,
+});
+
+const cancelClick = () => {
+  drawerVisible.value = false;
+
+  remarkRef.value.resetFields();
+};
+
+const feedBackEmit = defineEmits(["finish"]);
+
+// 用户信息
+const userInfo = ref({});
+const userList = ref([]);
+const getUserInfo = async () => {
+  getUserTree().then((data) => {
+    userList.value = data.data;
+  });
+};
+
+const confirmClick = () => {
+  remark.user = userStore.user.username;
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark2Copy = {
+        content: remark.content,
+        user: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+      let remark3 = {
+        content: "",
+        user: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        time: "",
+      };
+
+      let p = {
+        id: saleModel.value.id,
+        remark7: JSON.stringify(remark2Copy),
+        step: 7, //步骤 1 投书或建议处置意见 2 整改及纠正措施验证 3 处置情况的反馈意见
+      };
+
+      dealFeedback(p).then(() => {
+        feedBackEmit("finish");
+        cancelClick();
+      });
+    } else {
+      console.log("remarkRef invalid");
+      return false;
+    }
+  });
+};
+</script>
+
+<style scoped lang="scss">
+@media print {
+  #print {
+    position: absolute; /* 或 absolute, fixed, 根据需要调整 */
+    top: 20px; /* 调整顶部位置 */
+    margin: 0; /* 重置边距 */
+    width: 1000px;
+  }
+}
+</style>

+ 19 - 4
src/views/sales/index.vue

@@ -65,8 +65,11 @@
       <Add ref="addRef" @finish="getData"></Add>
       <Detail ref="detailRef"></Detail>
       <Handle2 ref="handle2Ref" @finish="getData"></Handle2>
+      <Handle3 ref="handle3Ref" @finish="getData"></Handle3>
+      <Handle4 ref="handle4Ref" @finish="getData"></Handle4>
       <Handle5 ref="handle5Ref" @finish="getData"></Handle5>
-      <Handle6 ref="handle5Ref" @finish="getData"></Handle6>
+      <Handle6 ref="handle6Ref" @finish="getData"></Handle6>
+      <Handle7 ref="handle7Ref" @finish="getData"></Handle7>
     </div>
   </div>
 </template>
@@ -78,8 +81,11 @@ import { deleteFeedback, getSalesData } from "@/api/sales/index";
 import Add from "@/views/sales/add.vue";
 import Detail from "@/views/sales/detail.vue";
 import Handle2 from "@/views/sales/handle2.vue";
+import Handle3 from "@/views/sales/handle3.vue";
+import Handle4 from "@/views/sales/handle4.vue";
 import Handle5 from "@/views/sales/handle5.vue";
 import Handle6 from "@/views/sales/handle6.vue";
+import Handle7 from "@/views/sales/handle7.vue";
 
 defineOptions({
   name: "SPCSales",
@@ -145,16 +151,25 @@ const toDelete = async (row) => {
 
 // 处理相关
 const handle2Ref = ref(null);
+const handle3Ref = ref(null);
+const handle4Ref = ref(null);
 const handle5Ref = ref(null);
 const handle6Ref = ref(null);
+const handle7Ref = ref(null);
 const handle = (row) => {
   if (row.remark2 && !JSON.parse(row.remark2).content) {
     handle2Ref.value && handle2Ref.value.showDrawer(row); // 处理
+  } else if (row.remark3 && !JSON.parse(row.remark3).content) {
+    handle3Ref.value && handle3Ref.value.showDrawer(row); // 处理
+  } else if (row.remark4 && !JSON.parse(row.remark4).content) {
+    handle4Ref.value && handle4Ref.value.showDrawer(row); // 处理
   } else if (row.remark5 && !JSON.parse(row.remark5).content) {
-    handle6Ref.value && handle6Ref.value.showDrawer(row); // 处理
-  } else if (row.remark4) {
     handle5Ref.value && handle5Ref.value.showDrawer(row); // 处理
-  } else {
+  } else if (row.remark6 && !JSON.parse(row.remark6).content) {
+    handle6Ref.value && handle6Ref.value.showDrawer(row); // 处理
+  } else if (row.remark7 && !JSON.parse(row.remark7).content) {
+    handle7Ref.value && handle7Ref.value.showDrawer(row); // 处理
+  }else{
     ElMessage.info("该工单正在处理中。。。");
   }
 };