Sfoglia il codice sorgente

销售信息反馈

jiaxiaoqiang 7 mesi fa
parent
commit
3db6bfb499

+ 20 - 0
src/api/sales/index.ts

@@ -35,3 +35,23 @@ export function addFeedback(data: object) {
     data,
   });
 }
+
+// 删除销售反馈表
+
+export function deleteFeedback(id: number) {
+  return request({
+    url: "/api/v1/sales/del",
+    method: "post",
+    data: { id },
+  });
+}
+
+//处理反馈表
+
+export function dealFeedback(data: object) {
+  return request({
+    url: "/api/v1/sales/handle",
+    method: "post",
+    data,
+  });
+}

+ 120 - 0
src/views/sales/DetailCom.vue

@@ -0,0 +1,120 @@
+<template>
+  <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 v-for="(item, index) in contentArray" :key="index">
+          <td colspan="4">
+            <div class="sale-box">
+              <div class="sale-title">{{ item.title }}</div>
+              <div class="sale-content">
+                {{ item.content }}
+              </div>
+              <div class="sale-bottom">
+                <div class="desc">处理人:{{ item[`user${index + 1}`] }}</div>
+                <div class="desc">时间: {{ item.time }}</div>
+              </div>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+<script setup>
+const saleModel = ref({});
+
+const contentArray = ref([]);
+const refreshView = (row) => {
+  saleModel.value = row;
+
+  contentArray.value = [];
+
+  if (row.remark1 && JSON.parse(row.remark1).content) {
+    let remark1 = JSON.parse(row.remark1);
+    contentArray.value.push({ ...remark1, title: "顾客投诉或建议" });
+  }
+  if (row.remark2 && JSON.parse(row.remark2).content) {
+    let remark2 = JSON.parse(row.remark2);
+    contentArray.value.push({ ...remark2, title: "投诉或建议处置意见" });
+  }
+  if (row.remark3 && JSON.parse(row.remark3).content) {
+    let remark3 = JSON.parse(row.remark3);
+    contentArray.value.push({ ...remark3, title: "原因分析" });
+  }
+  if (row.remark4 && JSON.parse(row.remark4).content) {
+    let remark4 = JSON.parse(row.remark4);
+    contentArray.value.push({ ...remark4, title: "整改及纠正措施" });
+  }
+  if (row.remark5 && JSON.parse(row.remark5).content) {
+    let remark5 = JSON.parse(row.remark5);
+    contentArray.value.push({ ...remark5, title: "整改及纠正措施验证" });
+  }
+  if (row.remark6 && JSON.parse(row.remark6).content) {
+    let remark6 = JSON.parse(row.remark6);
+    contentArray.value.push({ ...remark6, title: "处置情况反馈意见" });
+  }
+};
+
+defineExpose({ refreshView });
+</script>
+
+<style scoped lang="scss">
+.sale-header {
+  text-align: center;
+  font-size: 20px;
+  font-weight: bold;
+  margin-bottom: 10px;
+}
+table {
+  width: 800px;
+  margin: 0 auto;
+  border: 1px solid #000000;
+  border-collapse: collapse;
+}
+
+th,
+td {
+  border: 1px solid #000000;
+  text-align: center;
+  padding: 3px;
+}
+
+.sale-box {
+  .sale-title {
+    font-size: 16px;
+    margin-bottom: 5px;
+    text-align: start;
+  }
+  .sale-content {
+    font-size: 16px;
+    min-height: 60px;
+    margin-bottom: 10px;
+    text-align: start;
+    padding: 0 8px;
+  }
+  .sale-bottom {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 10px;
+  }
+  .desc {
+    margin-right: 20px;
+  }
+}
+</style>

+ 70 - 6
src/views/sales/add.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-drawer v-model="drawerVisible" size="80%" :close-on-click-modal="false">
+    <el-drawer v-model="drawerVisible" size="800" :close-on-click-modal="false">
       <template #header>
         <h4>新增销售反馈信息</h4>
       </template>
@@ -25,22 +25,42 @@
           <el-form-item label="联系电话" prop="phoneNo">
             <el-input v-model="saleForm.phoneNo" />
           </el-form-item>
+          <el-form-item label="阶段" prop="stage">
+            <el-input v-model="saleForm.stage" />
+          </el-form-item>
           <el-form-item label="订单信息">
             <el-select
               v-model="selectOrderCode"
-              value-key="orderCode"
+              value-key="orderNo"
               placeholder="请选择订单信息"
               style="width: 100%"
               @change="orderSelect"
             >
               <el-option
                 v-for="item in orders"
-                :key="item.orderCode"
+                :key="item.orderNo"
                 :label="item.orderName"
                 :value="item"
               />
             </el-select>
           </el-form-item>
+
+          <el-form-item label="流转卡号" prop="seqs">
+            <el-select
+              v-model="saleForm.seqs"
+              value-key="orderCode"
+              placeholder="请选择流转卡号"
+              style="width: 100%"
+              multiple
+            >
+              <el-option
+                v-for="item in seqList"
+                :key="item"
+                :label="item"
+                :value="item"
+              />
+            </el-select>
+          </el-form-item>
         </el-form>
 
         <el-form
@@ -53,10 +73,10 @@
           <el-form-item label="顾客投诉或建议" prop="content">
             <el-input v-model="remark1.content" type="textarea" />
           </el-form-item>
-          <el-form-item label="处理人" prop="contacts">
+          <el-form-item label="填表人" prop="user">
             <el-select
               v-model="remark1.user"
-              placeholder="请选择联系人"
+              placeholder="请选择"
               style="width: 100%"
             >
               <el-option
@@ -74,9 +94,24 @@
               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="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-form-item>
         </el-form>
       </template>
       <template #footer>
@@ -100,6 +135,8 @@ const saleForm = reactive({
   address: "",
   contacts: "",
   phoneNo: "",
+  stage: "1",
+  seqs: [],
 });
 // 顾客投诉或建议
 const remark1Ref = ref(null);
@@ -108,6 +145,7 @@ const remark1 = reactive({
   content: "",
   user: "",
   time: "",
+  nextRemarkUser: "",
 });
 
 const rules = {
@@ -127,6 +165,7 @@ const rules = {
     { required: true, message: "请输入联系电话", trigger: "blur" },
     { min: 11, max: 11, message: "请输入正确的手机号", trigger: "blur" },
   ],
+  seqs: [{ required: true, message: "请选择订单信息", trigger: "change" }],
 };
 const rules1 = {
   content: [
@@ -138,6 +177,10 @@ const rules1 = {
     { 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" },
+  ],
 };
 
 // 订单相关信息
@@ -158,8 +201,11 @@ const getOrders = async () => {
 };
 const orderSelect = (value) => {
   selectedOrder.value = value;
+  seqList.value = selectedOrder.value.seqs;
 };
 
+const seqList = ref([]);
+
 // 用户信息
 const userInfo = ref({});
 const userList = ref([]);
@@ -185,12 +231,15 @@ const cancelClick = () => {
   remark1Ref.value.resetFields();
 };
 
+const feedBackEmit = defineEmits(["finish"]);
+
 const confirmClick = () => {
   console.log(saleForm);
   console.log(remark1);
   console.log(selectedOrder.value);
 
   // drawerVisible.value = false;
+
   //
   // // 验证表单
   baseInfoRef.value.validate((valid) => {
@@ -203,13 +252,28 @@ const confirmClick = () => {
   });
   remark1Ref.value.validate((valid) => {
     if (valid) {
+      let remark1Copy = {
+        content: remark1.content,
+        user1: remark1.user,
+        time: remark1.time,
+      };
+      let remark2 = {
+        content: "",
+        user2: remark1.nextRemarkUser,
+        time: "",
+      };
+
       let p = {
         ...saleForm,
         ...selectedOrder.value,
-        remark1: JSON.stringify(remark1),
+        remark1: JSON.stringify(remark1Copy),
+        remark2: JSON.stringify(remark2),
       };
 
+      p.seqs = p.seqs.join(",");
+
       addFeedback(p).then(() => {
+        feedBackEmit("finish");
         cancelClick();
       });
     } else {

+ 8 - 107
src/views/sales/detail.vue

@@ -5,79 +5,23 @@
     </template>
 
     <div id="print">
-      <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 v-for="(item, index) in contentArray" :key="index">
-            <td colspan="4">
-              <div class="sale-box">
-                <div class="sale-title">{{ item.title }}</div>
-                <div class="sale-content">
-                  {{ item.content }}
-                </div>
-                <div class="sale-bottom">
-                  <div class="desc">处理人:{{ item.user }}</div>
-                  <div class="desc">时间: {{ item.time }}</div>
-                </div>
-              </div>
-            </td>
-          </tr>
-        </tbody>
-      </table>
+      <DetailCom ref="detailComRef"></DetailCom>
     </div>
   </el-drawer>
 </template>
 
 <script setup>
-const saleModel = ref({});
-const drawerVisible = ref(false);
+import DetailCom from "@/views/sales/DetailCom.vue";
 
-const contentArray = ref([]);
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
 
 const showDrawer = (row) => {
-  saleModel.value = row;
-  contentArray.value = [];
-
-  if (row.remark1) {
-    let remark1 = JSON.parse(row.remark1);
-    contentArray.value.push({ ...remark1, title: "顾客投诉或建议" });
-  }
-  if (row.remark2) {
-    let remark2 = JSON.parse(row.remark2);
-    contentArray.value.push({ ...remark2, title: "投诉或建议处置意见" });
-  }
-  if (row.remark3) {
-    let remark3 = JSON.parse(row.remark3);
-    contentArray.value.push({ ...remark3, title: "原因分析" });
-  }
-  if (row.remark4) {
-    let remark4 = JSON.parse(row.remark4);
-    contentArray.value.push({ ...remark4, title: "整改及纠正措施" });
-  }
-  if (row.remark5) {
-    let remark5 = JSON.parse(row.remark5);
-    contentArray.value.push({ ...remark5, title: "整改及纠正措施验证" });
-  }
-  if (row.remark6) {
-    let remark6 = JSON.parse(row.remark6);
-    contentArray.value.push({ ...remark6, title: "处置情况反馈意见" });
-  }
-
   drawerVisible.value = true;
+
+  nextTick(() => {
+    detailComRef.value && detailComRef.value.refreshView(row);
+  });
 };
 
 defineExpose({ showDrawer });
@@ -92,47 +36,4 @@ defineExpose({ showDrawer });
     width: 1000px;
   }
 }
-
-.sale-header {
-  text-align: center;
-  font-size: 20px;
-  font-weight: bold;
-  margin-bottom: 10px;
-}
-table {
-  width: 800px;
-  margin: 0 auto;
-  border: 1px solid #000000;
-  border-collapse: collapse;
-}
-
-th,
-td {
-  border: 1px solid #000000;
-  text-align: center;
-  padding: 3px;
-}
-
-.sale-box {
-  .sale-title {
-    font-size: 16px;
-    margin-bottom: 5px;
-    text-align: start;
-  }
-  .sale-content {
-    font-size: 16px;
-    min-height: 60px;
-    margin-bottom: 10px;
-    text-align: start;
-    padding: 0 8px;
-  }
-  .sale-bottom {
-    display: flex;
-    justify-content: flex-end;
-    margin-top: 10px;
-  }
-  .desc {
-    margin-right: 20px;
-  }
-}
 </style>

+ 0 - 41
src/views/sales/handle.vue

@@ -1,41 +0,0 @@
-<template>
-  <div>
-    <el-drawer v-model="drawerVisible" size="80%" :close-on-click-modal="false">
-      <table>
-        <thead>
-          <tr>
-            <th>列标题1</th>
-            <th>列标题2</th>
-            <th>列标题3</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr>
-            <td>行1,列1</td>
-            <td>行1,列2</td>
-            <td>行1,列3</td>
-          </tr>
-          <tr>
-            <td>行2,列1</td>
-            <td>行2,列2</td>
-            <td>行2,列3</td>
-          </tr>
-        </tbody>
-      </table></el-drawer
-    >
-  </div>
-</template>
-
-<script setup>
-const saleModel = ref({});
-const drawerVisible = ref(false);
-
-const showDrawer = (row) => {
-  saleModel.value = row;
-  drawerVisible.value = true;
-};
-
-defineExpose({ showDrawer });
-</script>
-
-<style scoped lang="scss"></style>

+ 186 - 0
src/views/sales/handle2.vue

@@ -0,0 +1,186 @@
+<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
+          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-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";
+
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+
+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 () => {
+  const res = await getUserList();
+  userList.value = res.data;
+  // if (userList.value.length > 0) {
+  //   userInfo.value = userList.value[0];
+  // }
+};
+
+const confirmClick = () => {
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark2Copy = {
+        content: remark.content,
+        user2: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+      let remark3 = {
+        content: "",
+        user3: remark.nextRemarkUser, // qinhaibo和dengyu说是user1234的
+        time: "",
+      };
+
+      let p = {
+        id: saleModel.value.id,
+        remark2: JSON.stringify(remark2Copy),
+        remark3: JSON.stringify(remark3),
+        step: 1, //步骤 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>

+ 186 - 0
src/views/sales/handle5.vue

@@ -0,0 +1,186 @@
+<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
+          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-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";
+
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+
+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 () => {
+  const res = await getUserList();
+  userList.value = res.data;
+  // if (userList.value.length > 0) {
+  //   userInfo.value = userList.value[0];
+  // }
+};
+
+const confirmClick = () => {
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark5Copy = {
+        content: remark.content,
+        user5: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+      let remark6 = {
+        content: "",
+        user6: 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 处置情况的反馈意见
+      };
+
+      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>

+ 180 - 0
src/views/sales/handle6.vue

@@ -0,0 +1,180 @@
+<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
+          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-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";
+
+const drawerVisible = ref(false);
+const detailComRef = ref(null);
+const saleModel = ref({});
+
+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: 0,
+});
+
+const cancelClick = () => {
+  drawerVisible.value = false;
+
+  remarkRef.value.resetFields();
+};
+
+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];
+  // }
+};
+
+const confirmClick = () => {
+  remarkRef.value.validate((valid) => {
+    if (valid) {
+      let remark6Copy = {
+        content: remark.content,
+        user6: remark.user,
+        time: remark.time,
+        state: remark.state,
+      };
+
+      let p = {
+        id: saleModel.value.id,
+        remark6: JSON.stringify(remark6Copy),
+        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>

+ 34 - 7
src/views/sales/index.vue

@@ -37,10 +37,16 @@
               v-if="row.state === 0"
               link
               type="danger"
-              @click="toDelete(row.id)"
+              @click="toDelete(row)"
               >删除</el-button
             >
-            <el-button link @click="handle(row)" type="primary">处理</el-button>
+            <el-button
+              link
+              v-if="row.state === 0 || row.state === 1"
+              @click="handle(row)"
+              type="primary"
+              >处理</el-button
+            >
             <el-button link @click="toDetail(row)" type="primary"
               >详情</el-button
             >
@@ -56,8 +62,11 @@
         v-model:limit="currentOption.limit"
         @pagination="getData"
       />
-      <Add ref="addRef"></Add>
+      <Add ref="addRef" @finish="getData"></Add>
       <Detail ref="detailRef"></Detail>
+      <Handle2 ref="handle2Ref" @finish="getData"></Handle2>
+      <Handle5 ref="handle5Ref" @finish="getData"></Handle5>
+      <Handle6 ref="handle5Ref" @finish="getData"></Handle6>
     </div>
   </div>
 </template>
@@ -65,9 +74,12 @@
 <script setup>
 import Search from "@/components/Search/index.vue";
 import { useSpcStore } from "@/store";
-import { getSalesData } from "@/api/sales/index";
+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 Handle5 from "@/views/sales/handle5.vue";
+import Handle6 from "@/views/sales/handle6.vue";
 
 defineOptions({
   name: "SPCSales",
@@ -120,7 +132,10 @@ const toAdd = () => {
   addRef.value && addRef.value.showDrawer();
 };
 
-const toDelete = async (id) => {
+const toDelete = async (row) => {
+  const res = await deleteFeedback(row.id);
+  currentOption.page = 1;
+  getData();
   // const { code } = await deleteData({ id });
   // if (code == "200") {
   //   ElMessage.success("操作成功");
@@ -129,8 +144,20 @@ const toDelete = async (id) => {
 };
 
 // 处理相关
-const handleRef = ref(null);
-const handle = (row) => {};
+const handle2Ref = ref(null);
+const handle5Ref = ref(null);
+const handle6Ref = ref(null);
+const handle = (row) => {
+  if (row.remark2 && !JSON.parse(row.remark2).content) {
+    handle2Ref.value && handle2Ref.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 {
+    ElMessage.info("该工单正在处理中。。。");
+  }
+};
 
 // 详情
 const detailRef = ref(null);