kumu пре 1 година
родитељ
комит
dc9e774c31
4 измењених фајлова са 471 додато и 0 уклоњено
  1. 1 0
      package.json
  2. 37 0
      src/api/inventory/erp.js
  3. 208 0
      src/views/erp/edit.vue
  4. 225 0
      src/views/erp/list/index.vue

+ 1 - 0
package.json

@@ -52,6 +52,7 @@
     "js-cookie": "2.2.1",
     "jsbarcode": "^3.11.5",
     "jsencrypt": "3.0.0-rc.1",
+    "mathjs": "^14.0.1",
     "nprogress": "0.2.0",
     "qrcodejs2": "^0.0.2",
     "quill": "1.3.7",

+ 37 - 0
src/api/inventory/erp.js

@@ -0,0 +1,37 @@
+import request from "@/utils/request";
+
+export function erpList(query) {
+  const {pageNum, pageSize, date, ...data} = query;
+  if (Array.isArray(date)) [data.startTime, data.endTime = data.startTime] = date;
+  return request({
+    url: '/yfc-admin/erpOrderManage/pageErpOrder',
+    method: 'post',
+    data,
+    params: {pageNum, pageSize},
+  })
+}
+
+export function erpDetail(id) {
+  return request({
+    url: '/yfc-admin/erpOrderManage/getHealRepDetailById',
+    method: 'get',
+    params: {erpOrderId: id}
+  })
+}
+
+export function erpDelete(id) {
+  return request({
+    url: '/yfc-admin/erpOrderManage/cancelErpOrder',
+    method: 'post',
+    data: {},
+    params: {erpOrderIds: id},
+  })
+}
+
+export function erpUpdate(data) {
+  return request({
+    url: '/yfc-admin/erpOrderManage/receiveErpOrder',
+    method: 'post',
+    data,
+  })
+}

+ 208 - 0
src/views/erp/edit.vue

@@ -0,0 +1,208 @@
+<script>
+import {bignumber, chain, multiply} from "mathjs";
+import {erpDetail, erpUpdate} from "@/api/inventory/erp";
+
+export default {
+  props: {
+    id: {type: [String, Number], required: true},
+    editable: {type: Boolean, default: false},
+    selectable: {type: Boolean, default: false},
+  },
+  data() {
+    return {
+      loading: false,
+      model: {},
+      calibreOptions: [
+        {dictLabel: '合格', dictValue: '0'},
+        {dictLabel: '不合格', dictValue: '1'},
+      ],
+
+      selected: [],
+    }
+  },
+  watch: {
+    id(value, old) { if (value && value !== old) this.getData() },
+  },
+  created() {
+    if (this.id) this.getData();
+  },
+  methods: {
+    async getData() {
+      this.loading = true;
+      try {
+        const model = await erpDetail(this.id).then(res => res.data || {});
+        model.details = Array.isArray(model.details) ? model.details.map(item => {
+          if (!item.actualWarehousingAmount) item.actualWarehousingAmount = item.planWarehousingAmount;
+          return {
+            ...item, calibreStatus: item.calibreStatus || '0',
+            convertFactorValue: multiply(bignumber(item.convertFactor), bignumber(item.actualWarehousingAmount)).valueOf(),
+          }
+        }) : []
+        this.model = model;
+        this.selected = model.details;
+        this.$refs.table.toggleAllSelection();
+      } catch (error) {}
+      this.loading = false;
+    },
+    updateRow(row, value) {
+      value = bignumber(value || 0);
+      row.actuaPrice = multiply(value, bignumber(row.singlePrice)).valueOf();
+      row.convertFactorValue = multiply(value, bignumber(row.convertFactor)).valueOf();
+    },
+    selectRow(rows) {
+      this.selected = rows;
+      let totalActualWarehousingAmount = chain(bignumber(0));
+      let totalActuaPrice = chain(bignumber(0));
+      for (const item of this.selected) {
+        totalActualWarehousingAmount = totalActualWarehousingAmount.add(bignumber(item.actualWarehousingAmount));
+        totalActuaPrice = totalActuaPrice.add(bignumber(item.actuaPrice));
+      }
+      this.model.actualWarehousingAmount = totalActualWarehousingAmount.value.valueOf();
+      this.model.actuaPrice = totalActuaPrice.value.valueOf();
+    },
+    async handle() {
+      if (!this.selected.length) return this.msgInfo('请至少选择一条数据');
+      let totalActualWarehousingAmount = chain(bignumber(0));
+      let totalActuaPrice = chain(bignumber(0));
+      for (const item of this.selected) {
+        if (!item.actualWarehousingAmount) return this.msgError('请完善实际入库数据');
+        totalActualWarehousingAmount = totalActualWarehousingAmount.add(bignumber(item.actualWarehousingAmount));
+        totalActuaPrice = totalActuaPrice.add(bignumber(item.actuaPrice));
+      }
+      try {
+        await erpUpdate({
+          // ...this.model,
+          id: this.id,
+          actualWarehousingAmount: totalActualWarehousingAmount.value.valueOf(),
+          actuaPrice: totalActuaPrice.value.valueOf(),
+          details: this.selected,
+        })
+        this.$emit('close', true);
+      } catch (error) {}
+    },
+    cancel() {
+      this.$emit('close', false);
+    },
+    handleDelete() {
+      this.$emit('delete', {id: this.id});
+    },
+  }
+}
+</script>
+
+<template>
+  <div>
+    <el-form ref="form" :model="model"
+             label-width="80px" label-position="top"
+    >
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <el-form-item label="ERP订单号" prop="erpNo">
+            <el-input style="width: 100%" v-model="model.erpNo" placeholder="请输入ERP订单号"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="操作时间" prop="updateTime">
+            <el-input style="width: 100%" v-model="model.updateTime" placeholder="请输入操作时间"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="供货单位" prop="supplierName">
+            <el-input style="width: 100%" v-model="model.supplierName" placeholder="请输入供货单位"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="6">
+          <el-form-item label="计划入库" prop="planWarehousingAmount">
+            <el-input style="width: 100%" v-model="model.planWarehousingAmount" placeholder="请输入计划入库"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="实际入库" prop="updateTime">
+            <el-input style="width: 100%" v-model="model.actualWarehousingAmount" placeholder="请输入实际入库"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="计划金额" prop="planPrice">
+            <el-input style="width: 100%" v-model="model.planPrice" placeholder="请输入计划金额"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="实际金额" prop="actuaPrice">
+            <el-input style="width: 100%" v-model="model.actuaPrice" placeholder="请输入实际金额"
+                      disabled
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table ref="table" :data="model.details"
+                v-loading="loading"
+                @selection-change="selectRow">
+        <el-table-column v-if="selectable && editable" type="selection" width="55" align="center"/>
+        <el-table-column label="序号" type="index" width="65" align="center"></el-table-column>
+        <el-table-column label="药品名称" prop="drugsName" width="110" align="center"></el-table-column>
+        <el-table-column label="药品规格" prop="specsName" width="110" align="center"></el-table-column>
+        <el-table-column label="供货单位" prop="supplierName" width="110" align="center"></el-table-column>
+        <el-table-column label="药品产地" prop="placeName" width="110" align="center"></el-table-column>
+        <el-table-column label="药品单价" prop="singlePrice" width="110" align="center"></el-table-column>
+        <el-table-column label="生产批号" prop="productionCode" width="110" align="center"></el-table-column>
+        <el-table-column label="计划入库" prop="planWarehousingAmount" width="110" align="center"></el-table-column>
+        <el-table-column label="实际入库" prop="actualWarehousingAmount" width="110" align="center">
+          <template slot-scope="scope">
+            <el-input-number v-if="editable" style="width: 100%;" v-model="scope.row.actualWarehousingAmount"
+                             :min="0"
+                             controls-position="right"
+                             placeholder="实际入库" :disabled="!editable"
+                             @change="updateRow(scope.row, $event)"
+            />
+            <span v-else>{{ scope.row.actualWarehousingAmount }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="转化系数" prop="convertFactor" width="110" align="center"></el-table-column>
+        <el-table-column label="转化后数量" prop="convertFactorValue" width="110" align="center"></el-table-column>
+        <el-table-column label="成本价格" prop="costPrice" width="110" align="center"></el-table-column>
+        <el-table-column label="实际金额" prop="actuaPrice" width="110" align="center"></el-table-column>
+        <el-table-column label="生产日期" prop="produceTime" width="110" align="center"></el-table-column>
+        <el-table-column label="有效日期" prop="validTime" width="110" align="center"></el-table-column>
+        <el-table-column label="质量情况" prop="calibreStatus" width="110" align="center">
+          <template slot-scope="scope">
+            <el-select v-if="editable" v-model="scope.row.calibreStatus" placeholder="质量情况">
+              <el-option v-for="item in calibreOptions" :key="item.dictValue" :value="item.dictValue"
+                         :label="item.dictLabel"></el-option>
+            </el-select>
+            <dict-tag v-else :options="calibreOptions" :value="scope.row.calibreStatus"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" prop="remark" width="110" align="center">
+          <template slot-scope="scope">
+            <el-input v-if="editable" v-model="scope.row.remark" placeholder="备注"/>
+            <span v-else>{{ scope.row.remark }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <div v-if="editable" class="el-dialog__footer">
+      <el-button type="primary" @click="handle" :disabled="selected.length === 0">接 收</el-button>
+      <el-button v-hasPermi="['inventory:erp:remove']" type="danger" @click="handleDelete">作 废</el-button>
+      <el-button @click="cancel">取 消</el-button>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="scss">
+
+</style>
+

+ 225 - 0
src/views/erp/list/index.vue

@@ -0,0 +1,225 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <div class="query-box">
+        <div class="query-box__left">
+          <el-form-item label="" prop="keepingTime">
+            <el-date-picker style="width:340px" v-model="queryParams.date"
+                            type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss"
+                            start-placeholder="开始时间" end-placeholder="结束时间"
+                            size="small" clearable
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="" prop="orderStatus">
+            <el-select style="width:160px" v-model="queryParams.orderStatus" placeholder="请选择状态" size="small"
+                       clearable>
+              <el-option v-for="item in orderOptions" :key="item.dictValue" :value="item.dictValue"
+                         :label="item.dictLabel"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="" prop="erpNo">
+            <el-input style="width:160px" v-model="queryParams.erpNo" placeholder="请输入ERP单号" size="small" clearable
+                      @keyup.enter.native="handleQuery"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="" prop="orderNo">
+            <el-input style="width:160px" v-model="queryParams.orderNo" placeholder="请输入订单号" size="small"
+                      clearable
+                      @keyup.enter.native="handleQuery"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="" prop="supplierId">
+            <el-select style="width:160px" v-model="queryParams.supplierId" placeholder="请选择供货单位" size="small"
+                       clearable>
+              <el-option v-for="item in supplierOptions" :key="item.id" :value="item.id" :label="item.name"></el-option>
+            </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>
+        </div>
+      </div>
+    </el-form>
+
+    <el-table v-loading="loading" :data="list" size="mini" border>
+      <el-table-column type="index" width="55" align="center" label="序号"/>
+      <el-table-column label="创建时间" align="center" prop="createTime"/>
+      <el-table-column label="ERP单号" align="center" prop="erpNo"/>
+      <el-table-column label="订单号" align="center" prop="orderNo"/>
+      <el-table-column label="状态" align="center" prop="orderStatus">
+        <template slot-scope="scope">
+          <dict-tag :options="orderOptions" :value="scope.row.orderStatus"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="药房" align="center" prop="pharmacyName"/>
+      <el-table-column label="供货单位" align="center" prop="supplierName"/>
+      <el-table-column label="计划入库" align="center" prop="planWarehousingAmount"/>
+      <el-table-column label="实际入库" align="center" prop="actualWarehousingAmount"/>
+      <el-table-column label="计划金额" align="center" prop="planPrice"/>
+      <el-table-column label="实际金额" align="center" prop="actuaPrice"/>
+      <el-table-column label="操作人" align="center" prop="updateBy"/>
+      <el-table-column label="操作时间" align="center" prop="updateTime"/>
+      <el-table-column label="备注" align="center" prop="remark"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="220" fixed="right">
+        <template slot-scope="scope">
+
+          <template v-if="scope.row.orderStatus === '0'">
+            <el-button style="width: 40px;" type="primary" size="mini"
+                       v-hasPermi="['inventory:erp:edit']"
+                       @click="handleEdit(scope.row)"
+            >接收
+            </el-button>
+            <el-button style="width: 40px;" type="danger" size="mini"
+                       v-hasPermi="['inventory:erp:remove']"
+                       @click="handleDelete(scope.row)"
+            >作废
+            </el-button>
+          </template>
+          <template v-if="scope.row.orderStatus !== '0'">
+            <el-button style="width: 40px;" type="default" size="mini"
+                       v-hasPermi="['inventory:erp:preview']"
+                       @click="handlePreview(scope.row)"
+            >查看
+            </el-button>
+          </template>
+        </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 :fullscreen="true" :title="title" :visible.sync="open" width="1180px" append-to-body size="mini">
+      <edit v-if="model.id" :id="model.id" :editable="editable" @close="open = false;$event && getList()" @delete="handleDelete"></edit>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listSupplier} from "@/api/pharmacy/supplier";
+import selectTable from '@/components/selectTable/selectTable.vue'
+import dayjs from "dayjs";
+
+import {erpDelete, erpList} from "@/api/inventory/erp";
+import Edit from "@/views/erp/edit.vue";
+
+export default {
+  name: "ErpList",
+  components: {
+    Edit,
+    selectTable
+  },
+  data() {
+    return {
+      list: [],
+      orderOptions: [
+        {dictLabel: '待接收', dictValue: '0'},
+        {dictLabel: '已接收', dictValue: '1'},
+        {dictLabel: '已作废', dictValue: '2'},
+      ],
+      supplierOptions: [],
+      model: {},
+      editable: false,
+      // 选中数组
+      ids: [],
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 是否显示弹出层
+      open: false,
+      // 弹出层标题
+      title: "",
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        pharmacyId: window.localStorage.getItem("pharmacyId"),
+        erpNo: '',
+        orderNo: '',
+        orderStatus: '',
+        supplierId: '',
+        date: [],
+      },
+    };
+  },
+  created() {
+    // this.getDicts("bill_state")
+    this.getListSupplier();
+    this.resetQuery();
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      erpList(this.queryParams).then((response) => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      }).catch((error) => { this.loading = false; });
+      this.model = {};
+    },
+
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.date = [
+        dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
+        dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss'),
+      ]
+      this.handleQuery();
+    },
+
+    handlePreview(row) {
+      this.model = {...row};
+      this.editable = false;
+      this.open = true;
+    },
+    handleEdit(row) {
+      this.model = {...row};
+      this.editable = true;
+      this.open = true;
+    },
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm("是否作废该订单?", "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+        .then(() => erpDelete(ids))
+        .then(() => {
+          this.open = false;
+          this.getList();
+          this.msgSuccess("作废成功");
+        })
+        .catch(() => {});
+    },
+    //供货单位
+    getListSupplier() {
+      listSupplier().then((res) => {
+        this.supplierOptions = res.rows;
+      });
+    },
+  },
+};
+</script>
+<style scoped>
+.el-input--small .el-input__inner {
+  height: 36px;
+  line-height: 36px;
+}
+</style>