瀏覽代碼

店铺端溯源码逻辑提交

yjwang 1 周之前
父節點
當前提交
cb9c00c36a
共有 3 個文件被更改,包括 672 次插入5 次删除
  1. 69 0
      src/api/store/verify.js
  2. 61 5
      src/views/store/storeProduct/index.vue
  3. 542 0
      src/views/store/storeVerify/index.vue

+ 69 - 0
src/api/store/verify.js

@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+// 查询核销码列表
+export function listScrm(query) {
+  return request({
+    url: '/shop/scrm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询核销码详细
+export function getScrm(id) {
+  return request({
+    url: '/shop/scrm/' + id,
+    method: 'get'
+  })
+}
+
+// 新增核销码
+export function addScrm(data) {
+  return request({
+    url: '/shop/scrm',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改核销码
+export function updateScrm(data) {
+  return request({
+    url: '/shop/scrm',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除核销码
+export function delScrm(id) {
+  return request({
+    url: '/shop/scrm/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出核销码
+export function exportScrm(query) {
+  return request({
+    url: '/shop/scrm/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function importVerifyNoteTemplate() {
+  return request({
+    url: '/shop/scrm/downloadTemplate',
+    method: 'get'
+  })
+}
+
+// 核销核销码
+export function writeOff(data) {
+  return request({
+    url: '/shop/scrm/writeOff',
+    method: 'post',
+    data: data
+  })
+}

+ 61 - 5
src/views/store/storeProduct/index.vue

@@ -407,6 +407,13 @@
             @click="productCopy(scope.row)"
           >一键复制
           </el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-document-copy"
+              @click="openVerify(scope.row)"
+            >溯源码管理
+            </el-button>
           </div>
         </template>
       </el-table-column>
@@ -494,7 +501,7 @@
 
 
 
-        
+
 
         <el-row>
           <el-col :span="12">
@@ -1113,7 +1120,20 @@
     <el-button @click="exemptDeviceDialogVisible = false">关 闭</el-button>
   </div>
 </el-dialog>
-
+    <!-- 溯源码管理弹窗 -->
+    <el-dialog
+      :title="titleVisible"
+      :visible.sync="verifyDialogVisible"
+      width="90%"
+      append-to-body
+      :before-close="handleVerifyDialogClose"
+    >
+      <VerifyCode
+        v-if="verifyDialogVisible"
+        :product-id="currentProductId"
+        ref="verifyCodeRef"
+      />
+    </el-dialog>
   </div>
 </template>
 
@@ -1145,6 +1165,7 @@ import {getCompanyList} from "@/api/company/company";
 import {listStore} from '@/api/store/store'
 import {getConfigByKey} from '@/api/system/config'
 import {qualifications, checkStoreDrugLicense, selectForbiddenKeywords,getExemptSecondMedicalDeviceList} from "@/api/store/storeProduct";
+import VerifyCode from '@/views/store/storeVerify/index.vue';
 
 export default {
   name: "HisStoreProduct",
@@ -1153,6 +1174,7 @@ export default {
     Editor,
     Material,
     singleImg,
+    VerifyCode
   },
   created() {
     this.$nextTick(() => {
@@ -1327,6 +1349,10 @@ export default {
   },
   data() {
     return {
+      // 溯源码弹窗相关
+      titleVisible:'溯源管理:',
+      verifyDialogVisible: false, // 溯源码弹窗显示状态
+      currentProductId: null,     // 当前选中的商品ID
       isIngredientValid: true, // 成分是否有效
       isLicenseValid: true, // 许可证是否有效
       authVisible:false,
@@ -1678,7 +1704,7 @@ export default {
       // 检查是否为II类或III类器械
       const cateName = this.cateIdToNameMap[cateId];
       const isMedicalDevice = cateName !== undefined && (cateName.includes('III类器械') || cateName.includes('II类器械'));
-      
+
       // 只有当是II类或III类器械且器械编码不为空时才调用接口
       if (isMedicalDevice && medicalDeviceCode) {
         checkStoreDrugLicense({ cateId: cateId, medicalDeviceCode: medicalDeviceCode }).then(response => {
@@ -1699,7 +1725,7 @@ export default {
       // 检查是否为II类或III类器械
       const cateName = this.cateIdToNameMap[this.form.cateId];
       const isMedicalDevice = cateName !== undefined && (cateName.includes('III类器械') || cateName.includes('II类器械'));
-      
+
       // 只有当是II类或III类器械时才处理
       if (isMedicalDevice) {
         // 如果器械编码不为空,则调用检查接口
@@ -2499,7 +2525,37 @@ export default {
       }).catch(() => {
 
       });
-    }
+    },
+    //打开溯源码页面
+    openVerify(row) {
+      if (row) {
+        this.currentProductId = row.productId;
+      } else if (this.ids.length > 0) {
+        this.currentProductId = this.ids[0];
+        if (this.ids.length > 1) {
+          this.$message.warning('溯源码管理仅支持单个商品操作,已默认选择第一个商品');
+        }
+      } else {
+        this.$message.error('请先选择需要管理溯源码的商品');
+        return;
+      }
+      this.titleVisible = this.titleVisible + '《' + row.productName + '》';
+      this.verifyDialogVisible = true;
+    },
+    /**
+     * 关闭溯源码弹窗
+     */
+    handleVerifyDialogClose() {
+      if (this.$refs.verifyCodeRef) {
+        this.$refs.verifyCodeRef.fullReset();
+      }
+      setTimeout(() => {
+        this.currentProductId = null;
+      }, 100);
+      this.getList();
+      this.verifyDialogVisible = false;
+      this.titleVisible = "溯源管理";
+    },
   }
 };
 </script>

+ 542 - 0
src/views/store/storeVerify/index.vue

@@ -0,0 +1,542 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="核销码" prop="verifyCode">
+        <el-input
+          v-model="queryParams.verifyCode"
+          placeholder="核销码"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <!-- 出库状态筛选 -->
+      <el-form-item label="出库状态" prop="outboundStatus">
+        <el-select v-model="queryParams.outboundStatus" placeholder="请选择出库状态" clearable size="small">
+          <el-option label="未出库" value="0" />
+          <el-option label="已出库" value="1" />
+        </el-select>
+      </el-form-item>
+
+      <!-- 核销状态筛选 -->
+      <el-form-item label="核销状态" prop="verifyStatus">
+        <el-select v-model="queryParams.verifyStatus" placeholder="请选择核销状态" clearable size="small">
+          <el-option label="未核销" value="0" />
+          <el-option label="已核销" value="1" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['shop:scrm:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['shop:scrm:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['shop:scrm:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['shop:scrm:export']"
+        >导出</el-button>
+      </el-col>
+      <!-- 新增:批量核销按钮 -->
+      <el-col :span="1.8">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-check-circle"
+          size="mini"
+          :disabled="multiple || hasWriteOffAll"
+          @click="handleBatchWriteOff"
+          v-hasPermi="['shop:scrm:writeOff']"
+        >批量核销</el-button>
+      </el-col>
+      <el-col :span="1.8">
+        <el-button
+          icon="el-icon-s-order"
+          size="mini"
+          type="warning"
+          @click="openDeliveryNote"
+        >批量导入溯源码
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="scrmList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="核销码" align="center" prop="verifyCode" />
+      <el-table-column label="关联商品ID" align="center" prop="productId" />
+      <el-table-column
+        label="出库状态"
+        align="center"
+        prop="outboundStatus"
+        :formatter="formatOutboundStatus"
+      />
+      <el-table-column
+        label="核销状态"
+        align="center"
+        prop="verifyStatus"
+        :formatter="formatVerifyStatus"
+      />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['shop:scrm:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['shop:scrm:remove']"
+          >删除</el-button>
+          <!-- 新增:单个核销按钮 -->
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-check"
+            :disabled="scope.row.verifyStatus === 1"
+            @click="handleSingleWriteOff(scope.row)"
+            v-hasPermi="['shop:scrm:writeOff']"
+          >核销</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改核销码对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <!-- 用户自定义核销码 -->
+        <el-form-item label="核销码" prop="verifyCode">
+          <el-input v-model="form.verifyCode" placeholder="核销码" />
+        </el-form-item>
+        <el-form-item label="出库状态" prop="outboundStatus">
+          <el-radio-group v-model="form.outboundStatus">
+            <el-radio :label="0">未出库</el-radio>
+            <el-radio :label="1">已出库</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <!-- 核销状态 -->
+        <el-form-item label="核销状态" prop="verifyStatus">
+          <el-radio-group v-model="form.verifyStatus">
+            <el-radio :label="0">未核销</el-radio>
+            <el-radio :label="1">已核销</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+      :before-close="handleClose"
+      :visible.sync="verifyNoteOpen"
+      center
+      title="批量导入溯源码"
+      width="35%"
+      :append-to-body="true"
+    >
+      <span slot="footer" class="dialog-footer">
+
+        <el-upload ref="upload" :action="getUploadUrl()" :auto-upload="false" :disabled="verifyUpload.isUploading"
+                   :headers="verifyUpload.headers"
+                   :limit="1" :on-progress="handleFileUploadProgress"
+                   :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
+        >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          将文件拖到此处,或
+          <em>点击上传</em>
+        </div>
+        <div slot="tip" class="el-upload__tip">
+          <el-link style="font-size:12px" type="info" @click="importVerifyNoteTemplate">下载模板</el-link>
+        </div>
+        <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+      </el-upload>
+        <el-divider></el-divider>
+        <el-button @click="verifyNoteOpen = false">取 消</el-button>
+        <el-button type="primary" @click="submitDeliveryNote">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listScrm, getScrm, delScrm, addScrm, updateScrm, exportScrm ,importVerifyNoteTemplate,writeOff} from "@/api/store/verify";
+import { getToken } from '@/utils/auth'
+
+export default {
+  name: "Scrm",
+  props: {
+    productId: {
+      type: [Number, String],
+      default: null,
+      required: false
+    }
+  },
+  data() {
+    return {
+      importMsgOpen: false,
+      importMsg: '',
+      verifyUpload: {
+        open: false,
+        title: '',
+        isUploading: false,
+        updateSupport: 0,
+        headers: {Authorization: 'Bearer ' + getToken()},
+        url: process.env.VUE_APP_BASE_API + '/shop/scrm/importExpress',
+      },
+      verifyNoteOpen: false,
+      loading: true,
+      exportLoading: false,
+      ids: [],
+      single: true,
+      multiple: true,
+      hasWriteOffAll: false,
+      showSearch: true,
+      total: 0,
+      scrmList: [],
+      title: "",
+      open: false,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        verifyCode: null,
+        productId: null,
+        outboundStatus: null,
+        verifyStatus: null,
+        status: null,
+        isDel: null,
+      },
+      form: {},
+      rules: {
+        verifyCode: [
+          { required: true, message: "用户自定义核销码不能为空", trigger: "blur" }
+        ],
+        productId: [
+          { required: true, message: "关联商品ID不能为空", trigger: "blur" }
+        ],
+        outboundStatus: [
+          { required: true, message: "出库状态不能为空", trigger: "blur" }
+        ],
+        verifyStatus: [
+          { required: true, message: "核销状态不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "数据状态不能为空", trigger: "blur" }
+        ],
+        isDel: [
+          { required: true, message: "是否删除不能为空", trigger: "blur" }
+        ],
+        createTime: [
+          { required: true, message: "创建时间不能为空", trigger: "blur" }
+        ],
+        updateTime: [
+          { required: true, message: "更新时间不能为空", trigger: "blur" }
+        ]
+      },
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    fullReset() {
+      this.reset();
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        verifyCode: null,
+        productId: null,
+        outboundStatus: null,
+        verifyStatus: null,
+        status: null,
+        isDel: null,
+      };
+      this.scrmList = [];
+      this.total = 0;
+      this.ids = [];
+      this.single = true;
+      this.multiple = true;
+      this.hasWriteOffAll = false;
+      if (this.$refs.form) {
+        this.$refs.form.clearValidate();
+      }
+    },
+    // 出库状态翻译
+    formatOutboundStatus(row) {
+      return row.outboundStatus === 0 ? "未出库" : "已出库";
+    },
+    // 核销状态翻译
+    formatVerifyStatus(row) {
+      return row.verifyStatus === 0 ? "未核销" : "已核销";
+    },
+    // 是否删除翻译
+    formatIsDel(row) {
+      return row.isDel === 0 ? "未删除" : "已删除";
+    },
+    /** 查询核销码列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.productId = this.productId;
+      console.log("打印pp----------------->", this.productId);
+      listScrm(this.queryParams).then(response => {
+        this.scrmList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        verifyCode: null,
+        productId: this.productId,
+        outboundStatus: 0,
+        verifyStatus: 0,
+        status: 1,
+        isDel: 0
+      };
+      if (this.$refs.form) {
+        this.$refs.form.resetFields();
+      }
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据 - 新增:校验选中行的核销状态
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length;
+
+      // 校验选中的行是否全部已核销
+      this.hasWriteOffAll = selection.every(item => item.verifyStatus === 1);
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加核销码";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getScrm(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改核销码";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateScrm(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addScrm(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除核销码编号为"' + ids + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delScrm(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有核销码数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        this.exportLoading = true;
+        return exportScrm(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+        this.exportLoading = false;
+      }).catch(() => {});
+    },
+    openDeliveryNote() {
+      this.verifyNoteOpen = true
+      this.getAppList();
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done()
+        })
+        .catch(_ => {
+        })
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.verifyUpload.isUploading = true
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.verifyUpload.open = false;
+      this.verifyUpload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.importMsgOpen = true;
+      this.importMsg = response.msg;
+      console.log("打印请求-----------》",response.msg);
+      if(response.code == 200) {
+        this.$message.success(response.msg || '全部数据导入成功');
+      }
+      this.getList();
+    },
+    //发货单模板下载
+    importVerifyNoteTemplate() {
+      importVerifyNoteTemplate().then((response) => {
+        this.download(response.msg);
+      });
+    },
+    // 提交发货单
+    submitDeliveryNote() {
+      const uploadFiles = this.$refs.upload.uploadFiles;
+      if (uploadFiles.length === 0) {
+        this.$message.error('请选择要上传的文件');
+        return;
+      }
+      this.$refs.upload.submit();
+    },
+    getUploadUrl() {
+      if (!this.productId) {
+        this.$message.warning('请先选择商品ID');
+        return '';
+      }
+      return `${this.verifyUpload.url}?productId=${this.productId}`;
+    },
+
+    /** 单个核销操作 */
+    handleSingleWriteOff(row) {
+      this.$confirm(
+        `是否确认核销溯源码【${row.verifyCode}】?`,
+        "核销确认",
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "info"
+        }
+      ).then(() => {
+        return writeOff({ids:[row.id]});
+      }).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("核销成功!");
+          this.getList(); // 刷新列表
+        }
+      })
+    },
+
+    /** 批量核销操作 */
+    handleBatchWriteOff() {
+      this.$confirm(
+        `是否确认核销选中的${this.ids.length}条溯源码数据?`,
+        "批量核销确认",
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "info"
+        }
+      ).then(() => {
+        // 调用核销接口
+        return writeOff({ids:this.ids});
+      }).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess(`批量核销成功!共核销${this.ids.length}条数据`);
+          this.getList();
+          this.ids = [];
+          this.hasWriteOffAll = false;
+        }
+      })
+    }
+  }
+};
+</script>