Ver código fonte

单车核算,单趟核算,

lrf402788946 4 anos atrás
pai
commit
2a15ff2e66

+ 66 - 71
src/views/car/once.vue

@@ -1,16 +1,32 @@
 <template>
   <div id="once">
+    <alert :content="['请手动选择条件查询']"></alert>
     <animates>
-      <data-table height="600px" :select="true" :fields="fields" :data="list" :opera="opera" :total="total" @handleSelect="toSelect" v-if="!dialog">
+      <data-table
+        height="600px"
+        :select="true"
+        :fields="fields"
+        :data="list"
+        :opera="opera"
+        :total="total"
+        @query="search"
+        @handleSelect="toSelect"
+        v-if="!dialog"
+      >
         <template #options="{item}">
-          <template v-if="item.model == 'car_no'">
-            <el-option v-for="(i, index) in carList" :key="`car-${index}`" :label="i.name" :value="i._id"></el-option>
+          <template v-if="item.model == 'car'">
+            <el-option v-for="(i, index) in carList" :key="`car-${index}`" :label="i.car_no" :value="i._id"></el-option>
           </template>
         </template>
         <template #filterEnd>
           <el-button v-if="selected.length <= 0" type="primary" :disabled="true">未选择任何运输单</el-button>
           <el-button v-else type="primary" @click="toResult">查看选中的结果</el-button>
         </template>
+        <template #custom="{item,row}">
+          <template v-if="item.model === 'goods'">
+            {{ getGoods(row) }}
+          </template>
+        </template>
       </data-table>
       <cardRL v-else>
         <template #header>
@@ -49,6 +65,8 @@
 const _ = require('lodash');
 import cardRL from '@f/layouts/cardRL.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: car } = createNamespacedHelpers('car');
+const { mapActions: transport } = createNamespacedHelpers('transport');
 export default {
   name: 'once',
   props: {},
@@ -58,37 +76,15 @@ export default {
       dialog: false,
       opera: [],
       fields: [
-        { label: '车号', model: 'car_no', filter: 'select' },
-        { label: '运输单号', model: 'transport_no' },
+        { label: '车号', model: 'car', filter: 'select', notable: true },
+        { label: '运输单号', model: 'no' },
+        { label: '线路', model: 'route' },
         { label: '发货时间', model: 'send_time', filter: 'date' },
-        // { label: '货物', model: 'goods' },
+        { label: '签收时间', model: 'sign_time', filter: 'date' },
+        { label: '货物', model: 'goods', custom: true },
       ],
       carList: [], // 查车列表
-      list: [
-        {
-          id: '1',
-          car_no: 1,
-          order_no: 'or30928',
-          transport_no: 'tran-0987',
-          money: 100,
-          cost: [
-            { item: '罚款', money: 200 },
-            { item: '过桥费', money: 100 },
-          ],
-        },
-        {
-          id: '2',
-          car_no: 2,
-          order_no: 'or30lsi',
-          transport_no: 'tran-0928',
-          money: 400,
-          cost: [
-            { item: '罚款', money: 500, remark: '第一次' },
-            { item: '罚款', money: 200, remark: '第二次' },
-            { item: '过桥费', money: 100 },
-          ],
-        },
-      ],
+      list: [],
       total: 0,
       selected: [],
       form: {},
@@ -96,14 +92,14 @@ export default {
       inList: [],
       inFields: [
         { label: '订单号', model: 'order_no' },
-        { label: '运输单号', model: 'transport_no' },
-        // { label: '发货时间', model: 'send_time', filter: 'date' },
-        { label: '收入金额', model: 'money' },
+        { label: '运输单号', model: 'no' },
+        { label: '货物', model: 'name' },
+        { label: '收入金额', model: 'sh_ys' },
       ],
       outList: [],
       outFields: [
-        { label: '订单号', model: 'order_no' },
-        { label: '运输单号', model: 'transport_no' },
+        { label: '运输单号', model: 'no' },
+        { label: '支出项目', model: 'item' },
         { label: '支出金额', model: 'money' },
         { label: '备注', model: 'remark' },
       ],
@@ -111,24 +107,33 @@ export default {
       count: {},
     };
   },
-  created() {},
+  created() {
+    this.getOhterList();
+  },
   methods: {
-    async search({ skip = 0, limit = 10 }) {},
+    ...transport(['query', 'update', 'calculate']),
+    ...car({ getCarList: 'query' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, supply_type: '0' });
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `list`, data);
+        this.$set(this, `total`, total);
+      }
+    },
     toSelect(data) {
-      console.log(data);
       this.selected = data;
     },
-    toResult() {
-      this.dialog = true;
-      // 整理数据,将被选择的所有运输单收入和支出分成2部分
-      // 收入,直接拿来就行,就是显示的不一样
-      const inList = _.cloneDeep(this.selected);
-      this.$set(this, `inList`, inList);
-      // 获取支出列表
-      const outList = this.getOutList();
-      this.$set(this, `outList`, outList);
-      // 计算合计部分
-      this.getCount();
+    async toResult() {
+      const ids = this.selected.map(i => i._id);
+      const res = await this.calculate({ ids, type: 'once' });
+      if (this.$checkRes(res)) {
+        const { inBill, outBill, count } = res;
+        this.$set(this, `inList`, inBill);
+        this.$set(this, `outList`, outBill);
+        this.$set(this, `count`, count);
+        this.dialog = true;
+      }
     },
     /**
      * 获取支出列表
@@ -151,27 +156,6 @@ export default {
     /**
      * 获取合计
      */
-    getCount() {
-      let inList = _.cloneDeep(this.inList);
-      let outList = _.cloneDeep(this.outList);
-      let im = 0;
-      let om = 0;
-      console.log(inList);
-      console.log(outList);
-      if (_.isArray(inList))
-        im = _.round(
-          inList.reduce((p, n) => p + (n.money || 0), 0),
-          2
-        );
-      if (_.isArray(outList))
-        om = _.round(
-          outList.reduce((p, n) => p + (n.money || 0), 0),
-          2
-        );
-      console.log(im, om);
-      let total = _.round(im - om, 2);
-      this.$set(this, `count`, { im, om, total });
-    },
     toExport() {
       // TODO 导出excel
       let msg = this.$message({ message: '正在导出,请稍后', duration: 0 });
@@ -181,6 +165,17 @@ export default {
       this.dialog = false;
       this.selected = [];
     },
+    async getOhterList() {
+      const cres = await this.getCarList();
+      if (this.$checkRes(cres)) this.$set(this, `carList`, cres.data);
+    },
+    getGoods(data) {
+      let goods = _.get(data, 'goods', []);
+      if (goods && _.isArray(goods) && goods.length > 0) {
+        goods = goods.map(i => i.name);
+        return goods.join(';');
+      }
+    },
   },
   computed: {
     ...mapState(['user', 'menuParams']),

+ 55 - 19
src/views/car/out.vue

@@ -1,12 +1,12 @@
 <template>
   <div id="out">
     <el-form ref="form" :model="form" :inline="true" :rules="rules">
-      <el-form-item prop="car_no">
+      <el-form-item prop="car_no" required>
         <el-select v-model="form.car_no" placeholder="请选择要核算的车号">
-          <el-option v-for="(i, index) in carList" :key="`car-${index}`" :label="i.car_no" :value="i.car_no"></el-option>
+          <el-option v-for="(i, index) in carList" :key="`car-${index}`" :label="i.car_no" :value="i._id"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item prop="date">
+      <el-form-item prop="date" required>
         <el-date-picker
           v-model="form.date"
           value-format="yyyy-MM-dd"
@@ -20,10 +20,10 @@
         </el-date-picker>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="toSearch">查询结果</el-button>
+        <el-button type="primary" @click="toSearch('search')">查询结果</el-button>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary">导出</el-button>
+        <el-button type="primary" @click="toSearch('export')">导出</el-button>
       </el-form-item>
     </el-form>
     <el-row type="flex" justify="space-around" class="btn_bar">
@@ -36,8 +36,8 @@
         </el-card>
       </el-col>
       <el-col :span="8">
-        <el-card :header="`运输支出:${count.tm || 0}`">
-          <data-table height="500px" :fields="tFields" :data="tList" :opera="opera" :usePage="false" useSum />
+        <el-card :header="`运输支出:${count.om || 0}`">
+          <data-table height="500px" :fields="tFields" :data="outList" :opera="opera" :usePage="false" useSum />
         </el-card>
       </el-col>
       <el-col :span="8">
@@ -52,6 +52,8 @@
 <script>
 const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: car } = createNamespacedHelpers('car');
+const { mapActions: transport } = createNamespacedHelpers('transport');
 export default {
   name: 'out',
   props: {},
@@ -68,7 +70,7 @@ export default {
       },
       carList: [],
       rules: {
-        // car_no: [{ required: true, message: '请选择要核算的车号', trigger: 'blur' }],
+        car_no: [{ required: true, message: '请选择要核算的车号', trigger: 'blur' }],
         date: [{ validator: checkDate, tigger: 'blur' }],
       },
       count: {},
@@ -76,15 +78,15 @@ export default {
       inList: [],
       inFields: [
         { label: '订单号', model: 'order_no' },
-        { label: '运输单号', model: 'transport_no' },
-        // { label: '发货时间', model: 'send_time', filter: 'date' },
-        { label: '收入金额', model: 'money' },
+        { label: '运输单号', model: 'no' },
+        { label: '货物', model: 'name' },
+        { label: '收入金额', model: 'sh_ys' },
       ],
       // transport,运输支出部分
-      tList: [],
+      outList: [],
       tFields: [
-        { label: '订单号', model: 'order_no' },
-        { label: '运输单号', model: 'transport_no' },
+        { label: '运输单号', model: 'no' },
+        { label: '支出项目', model: 'item' },
         { label: '支出金额', model: 'money' },
         { label: '备注', model: 'remark' },
       ],
@@ -98,22 +100,56 @@ export default {
       ],
     };
   },
-  created() {},
+  created() {
+    this.getOhterList();
+  },
   methods: {
+    ...transport(['carCalculate', 'export']),
+    ...car({ getCarList: 'query' }),
     async search() {
-      console.log('in function:search');
-      // TODO 整理数据,放到对应的列表中
+      const dup = this.setQuery();
+      const res = await this.carCalculate(dup);
+      if (this.$checkRes(res)) {
+        const { inBill, outBill, daily, count } = res;
+        this.$set(this, `inList`, inBill);
+        this.$set(this, `outList`, outBill);
+        this.$set(this, `dList`, daily);
+        this.$set(this, `count`, count);
+      }
+    },
+    // 导出
+    async toExport() {
+      const dup = this.setQuery();
+      const res = await this.export({ ...dup, type: 'car' });
+      console.log(res);
     },
     // 校验数据
-    toSearch() {
+    toSearch(type) {
       this.$refs['form'].validate(valid => {
         if (valid) {
-          this.search();
+          if (type === 'search') this.search();
+          else this.toExport();
         } else {
           return false;
         }
       });
     },
+    // 整理query
+    setQuery() {
+      const dup = _.cloneDeep(this.form);
+      if (!(_.isArray(dup.date) && dup.date.length === 2)) {
+        console.warn('数据不正确但经过了检测,需要注意');
+        return;
+      }
+      dup.start = dup.date[0];
+      dup.end = dup.date[1];
+      delete dup.date;
+      return dup;
+    },
+    async getOhterList() {
+      const cres = await this.getCarList();
+      if (this.$checkRes(cres)) this.$set(this, `carList`, cres.data);
+    },
   },
   computed: {
     ...mapState(['user', 'menuParams']),

+ 80 - 23
src/views/car/transport-out.vue

@@ -1,12 +1,22 @@
 <template>
   <div id="transport-out">
-    <data-table height="600px" :fields="fields" :data="list" :opera="opera" :total="total" @query="search" @edit="toEdit"> </data-table>
-    <el-dialog :title="`${form.order_no} 支出管理`" width="40%" center :visible.sync="dialog" @close="toClose" :destroy-on-close="true">
+    <data-table height="600px" :fields="fields" :data="list" :opera="opera" :total="total" @query="search" @edit="toEdit">
+      <template #options="{item}">
+        <template v-if="item.model === 'car'">
+          <el-option v-for="(i, index) in carList" :key="`car${index}`" :label="i.car_no" :value="i._id"></el-option>
+        </template>
+      </template>
+      <template #custom="{item,row}">
+        <template v-if="item.model === 'car'">
+          {{ getCar_no(row) }}
+        </template>
+      </template>
+    </data-table>
+    <el-dialog :title="`${form.no} 支出管理`" width="40%" center :visible.sync="dialog" @close="toClose" :destroy-on-close="true">
       <el-table :data="[form]" border>
-        <el-table-column align="center" label="订单号" prop="order_no" show-overflow-tooltip></el-table-column>
-        <el-table-column align="center" label="客户" prop="client" :showOverflowTooltip="true"></el-table-column>
+        <el-table-column align="center" label="运输单号" prop="no" show-overflow-tooltip></el-table-column>
         <el-table-column align="center" label="发货日期" prop="send_time"></el-table-column>
-        <el-table-column align="center" label="状态" prop="status"></el-table-column>
+        <el-table-column align="center" label="签收时间" prop="sign_time"></el-table-column>
       </el-table>
       <el-divider></el-divider>
       <el-row type="flex" justify="end" class="btn_bar">
@@ -14,10 +24,12 @@
           <el-button type="primary" @click="toAddCost">添加</el-button>
         </el-col>
       </el-row>
-      <el-table :data="costList" border stripe>
+      <el-table :data="form.out_bill" border stripe>
         <el-table-column align="center" label="费用项目">
           <template #default="{row}">
-            <el-select v-model="row.item"></el-select>
+            <el-select v-model="row.item">
+              <el-option v-for="(i, index) in costList" :key="`cost${index}`" :label="i.label" :value="i.value"></el-option>
+            </el-select>
           </template>
         </el-table-column>
         <el-table-column align="center" label="金额">
@@ -25,10 +37,14 @@
             <el-input type="number" v-model="row.money"></el-input>
           </template>
         </el-table-column>
-        <el-table-column align="center" label="添加人" prop="user"> </el-table-column>
+        <el-table-column align="center" label="添加人" prop="user">
+          <template v-slot="{ row }">
+            {{ getUser(row) }}
+          </template>
+        </el-table-column>
         <el-table-column align="center" label="备注">
           <template #default="{row}">
-            <el-input type="textarea" :autosize="{ minRows: 1, maxRows: 3 }" v-model="row.remark"></el-input>
+            <el-input type="textarea" :autosize="{ minRows: 1, maxRows: 2 }" v-model="row.remark"></el-input>
           </template>
         </el-table-column>
         <el-table-column align="center" label="操作">
@@ -49,6 +65,10 @@
 <script>
 const _ = require('lodash');
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: car } = createNamespacedHelpers('car');
+const { mapActions: user } = createNamespacedHelpers('user');
+const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
+const { mapActions: transport } = createNamespacedHelpers('transport');
 export default {
   name: 'transport-out',
   props: {},
@@ -64,24 +84,38 @@ export default {
         },
       ],
       fields: [
-        { label: '订单号', model: 'order_no', filter: true, options: { 'show-overflow-tooltip': true } },
-        { label: '客户', model: 'client', filter: 'select', showTip: true },
-        { label: '发货日期', model: 'send_time', filter: 'date' },
-        { label: '状态', model: 'status' },
+        { label: '运输单号', model: 'no', filter: true, options: { 'show-overflow-tooltip': true } },
+        { label: '车辆', model: 'car', custom: true, filter: 'select' },
+        { label: '线路', model: 'route' },
+        { label: '发货日期', model: 'send_time' },
+        { label: '签收日期', model: 'sign_time' },
       ],
-      list: [{ order_no: '129242', client: '长春市福瑞科技有限公司', send_time: '2020-10-10', status: '0' }],
+      list: [],
       total: 0,
       form: {},
+      carList: [],
+      userList: [],
       costList: [],
     };
   },
-  created() {},
+  created() {
+    this.search();
+    this.getOhterList();
+  },
   methods: {
-    async search({ skip = 0, limit = 10, ...info }) {
-      console.log(info);
+    ...user({ getUserList: 'query' }),
+    ...dictionary(['tree']),
+    ...transport(['query', 'update']),
+    ...car({ getCarList: 'query' }),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info, supply_type: '0' });
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `list`, data);
+        this.$set(this, `total`, total);
+      }
     },
     toEdit({ data }) {
-      console.log(data);
       this.$set(this, `form`, _.cloneDeep(data));
       // TODO 将费用列表单拿出来,set进costList中
       this.dialog = true;
@@ -92,21 +126,44 @@ export default {
       dup.costList = costList;
       const res = await this.update(dup);
       if (this.$checkRes(res, `支出修改成功`, res.errmsg || `支出修改失败`)) {
-        this.close();
+        this.toClose();
         this.search();
       }
     },
     toAddCost() {
-      const { name } = this.user;
-      this.costList.push({ name });
+      const { id } = this.user;
+      this.form.out_bill.push({ opera: id });
     },
     deleteCost(index) {
-      this.costList.splice(index, 1);
+      this.form.out_bill.splice(index, 1);
     },
     toClose() {
       this.dialog = false;
       this.form = {};
-      this.costList = [];
+    },
+    getCar_no(data) {
+      const { supplier } = data;
+      if (!supplier) return;
+      const { car_no } = supplier;
+      if (!car_no) return;
+      const r = this.carList.find(f => f._id === car_no);
+      if (!r) return;
+      return r.car_no || '';
+    },
+    getUser(data) {
+      const { opera } = data;
+      if (!opera) return;
+      const r = this.userList.find(f => f.id === opera);
+      if (!r) return;
+      return r.name;
+    },
+    async getOhterList() {
+      const cres = await this.getCarList();
+      if (this.$checkRes(cres)) this.$set(this, `carList`, cres.data);
+      const ures = await this.getUserList();
+      if (this.$checkRes(ures)) this.$set(this, `userList`, ures.data);
+      const d1 = await this.tree('zc');
+      if (this.$checkRes(d1)) this.$set(this, `costList`, d1);
     },
   },
   computed: {

+ 8 - 3
src/views/order/index.vue

@@ -38,8 +38,13 @@
         </el-row>
       </div>
     </animates>
-    <el-dialog :title="`订单${form.order_no || ''}记录`" :visible.sync="dialog" :destroy-on-close="true">
-      <data-table :data="form.record" :fields="recordFields" :usePage="false"></data-table>
+    <el-dialog :title="`订单${form.order_no || ''}记录`" width="30%" :visible.sync="dialog" :destroy-on-close="true">
+      <!-- <data-table :data="form.record" :fields="recordFields" :usePage="false"></data-table> -->
+      <el-timeline :reverse="false">
+        <el-timeline-item v-for="(i, index) in form.record" :key="`timeline${index}`" :timestamp="i.time" type="success" icon="el-icon-check">
+          {{ i.message }}
+        </el-timeline-item>
+      </el-timeline>
     </el-dialog>
   </div>
 </template>
@@ -135,7 +140,7 @@ export default {
         res = await this.create(duplicate);
       }
       if (this.$checkRes(res, '保存成功', '保存失败')) {
-        // this.toReturn();
+        this.toReturn();
         this.search();
       }
     },

+ 6 - 0
src/views/order/transport/index.vue

@@ -152,6 +152,7 @@
 </template>
 
 <script>
+// TODO 没有打印单据
 // 分页
 import page from '@f/components/pagination.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
@@ -304,6 +305,11 @@ export default {
         let route = goods[0];
         let newRoute = this.list.find(i => i.split.find(f => f._id == route._id));
         let routeData = this.routeList.find(i => i._id == newRoute.route);
+        if (!routeData) {
+          // TODO 此处主要是没有填写路线,导致不知道这单去哪里
+          this.$message.warning('有未填写 收入 的货物! 请先填写收入再装车');
+          return;
+        }
         let depositRoute = `${routeData.s_p}-${routeData.s_c}至${routeData.e_p}-${routeData.e_c}`;
         this.$set(this, `depositRoute`, depositRoute);
         this.$set(this, `goodsList`, goods);