ソースを参照

Merge branch 'master' of http://git.cc-lotus.info/news-zhwl/cms-zhwl

lrf402788946 4 年 前
コミット
9f431d6805

+ 2 - 0
src/store/index.js

@@ -20,6 +20,7 @@ import mode from '@f/store/client/mode';
 import car from '@f/store/car/car';
 import daily from '@f/store/car/daily';
 import order from '@f/store/order/order';
+import transport from '@f/store/order/transport';
 import util from '@f/store/util';
 import { menuParams, setMenuParams } from '@f/store/auth/menuParams';
 
@@ -48,5 +49,6 @@ export default new Vuex.Store({
     daily,
     order,
     schedule,
+    transport,
   },
 });

+ 3 - 0
src/views/client/contract.vue

@@ -72,6 +72,7 @@ export default {
         { label: '合同周期', model: 'period' },
         { label: '结算方式', model: 'settle_up' },
         { label: '结算周期', model: 'settle_up_period' },
+        { label: '截止日期', model: 'expiry_date', type: 'date' },
         {
           label: '状态',
           model: 'status',
@@ -103,6 +104,7 @@ export default {
         settle_up: [{ required: true, message: '请输入结算方式', trigger: 'blur' }],
         settle_up_period: [{ required: true, message: '请输入结算周期', trigger: 'blur' }],
         status: [{ required: true, message: '请选择状态', trigger: 'blur' }],
+        expiry_date: [{ required: true, message: '请选择截止日期', trigger: 'blur' }],
       },
       //客户列表
       nameList: [],
@@ -125,6 +127,7 @@ export default {
     // 查合同 其他参数是...info,都包括在里面,可以输出看看
     async searchTreaty({ skip = 0, limit = 10, ...info } = {}) {
       let obj = { skip, limit, ...info };
+      console.log(info);
       //如果role不是0就是用户,用户只能查看自己添加的合同,根据创始人owner来查询属于自己添加的合同
       //用户与管理员的区别就是需不需要根据owner这个条件来查询用户
       if (this.user.role !== '0') obj.owner = this.user.id;

+ 65 - 60
src/views/order/goods.vue

@@ -3,22 +3,20 @@
     <el-row>
       <el-col :span="24" class="container">
         <el-col :span="24" class="info">
-          <data-table :fields="fields" :data="list" :opera="opera" :total="total" :size="50" :step="10" @split="split">
-            <template #options="{item}">
-              <template v-if="item.model == 'name'">
-                <el-option v-for="(item, index) in nameList" :key="index" :value="item.name" :label="item.name"></el-option>
-              </template>
-              <template v-if="item.model == 'route'">
-                <el-option v-for="(item, index) in routeList" :key="index" :value="item.name" :label="item.name"></el-option>
-              </template>
-              <template v-if="item.model == 'contract'">
-                <el-option v-for="(item, index) in contractList" :key="index" :value="item.name" :label="item.name"></el-option>
-              </template>
-              <template v-if="item.model == 'project'">
-                <el-option v-for="(item, index) in projectList" :key="index" :value="item.name" :label="item.name"></el-option>
-              </template>
-            </template>
-          </data-table>
+          <el-row :gutter="20">
+            <el-col :span="12" class="card" v-for="(item, index) in list" :key="index">
+              <el-card class="box-card">
+                <div slot="header" class="clearfix">
+                  <el-row :gutter="10">
+                    <el-col class="card-header1" :span="24">订单号:{{ item.order_no }}</el-col>
+                    <el-col class="card-header1" :span="24">客户:{{ choose(item.client) }}</el-col>
+                    <!-- <el-col class="card-header1" :span="24">线路:xxxxxxxxxxxxxxxxxx</el-col> -->
+                  </el-row>
+                </div>
+                <data-table height="200px" :fields="fields" :data="item.goods" :usePage="false" :opera="opera"> </data-table>
+              </el-card>
+            </el-col>
+          </el-row>
         </el-col>
       </el-col>
     </el-row>
@@ -113,6 +111,8 @@
 </template>
 
 <script>
+const { mapActions: client } = createNamespacedHelpers('client');
+const { mapActions: order } = createNamespacedHelpers('order');
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   metaInfo() {
@@ -124,54 +124,15 @@ export default {
   data: function() {
     return {
       fields: [
-        { label: '订单号', model: 'ordernum' },
-        { label: '客户', model: 'name', filter: 'select' },
-        { label: '线路', model: 'route', filter: 'select' },
-        { label: '拆分单号', model: 'splitnum' },
-        { label: '货物', model: 'goods' },
+        { label: '货物', model: 'name' },
         { label: '数量', model: 'number' },
         { label: '重量', model: 'weight' },
         { label: '体积', model: 'volume' },
-        { label: '要求发货日期', model: 'time' },
-        { label: '合同', model: 'contract', notable: 'true', filter: 'select' },
-        { label: '项目', model: 'project', notable: 'true', filter: 'select' },
-      ],
-      list: [
-        {
-          ordernum: '111111',
-          name: '张三',
-          route: '减速电机卢新',
-          splitnum: '111_222',
-          goods: '好吃的',
-          number: '20',
-          weight: '20',
-          volume: '100',
-          time: '2020-9-19',
-        },
-        {
-          ordernum: '111111',
-          name: '张三',
-          route: '减速电机卢新',
-          splitnum: '111_222',
-          goods: '好吃的',
-          number: '20',
-          weight: '20',
-          volume: '100',
-          time: '2020-9-19',
-        },
+        { label: '备注', model: 'remark' },
       ],
+      list: [],
+      opera: [{ label: '拆分', method: 'splice' }],
       total: 0,
-      opera: [{ label: '拆分', method: 'split' }],
-      //客户列表
-      nameList: [{ name: '客户一' }, { name: '客户二' }, { name: '客户三' }],
-      //路线列表
-      routeList: [
-        { name: '路线一' },
-        { name: '路线二' },
-        {
-          name: '路线三',
-        },
-      ],
       form: {},
       dialog: false,
       tableData: [
@@ -190,10 +151,32 @@ export default {
       contractList: [{ name: '合同一' }, { name: '合同二' }],
       //项目列表
       projectList: [{ name: '项目一' }, { name: '项目二' }],
+      //客戶列表
+      nameList: [],
+      // name: [],
     };
   },
-  created() {},
+  async created() {
+    await this.search();
+  },
   methods: {
+    ...client({ clientQuery: 'query' }),
+    ...order(['query', 'create', 'update', 'delete', 'fetch']),
+    async search({ skip = 0, limit = 8, ...info } = {}) {
+      //查订单
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `list`, data);
+        this.$set(this, `total`, total);
+      }
+      //查客户列表
+      const res1 = await this.clientQuery({ type: '客户' });
+      if (this.$checkRes(res1)) {
+        const { data, total } = res1;
+        this.$set(this, `nameList`, data);
+      }
+    },
     //关闭
     toClose() {
       this.dialog = false;
@@ -219,6 +202,18 @@ export default {
     handleDelete(index, row) {
       console.log(index, row);
     },
+    // choose() {
+    //   let orderList = this.list;
+    //   for (let item of orderList) {
+    //     let arr = this.nameList.find(i => i.id === item.client);
+    //     item.name = arr.name;
+    //   }
+    //   this.$set(this, `list`, orderList);
+    // },
+    choose(client) {
+      const obj = this.nameList.find(i => i.id === client);
+      if (obj) return obj.name;
+    },
   },
   computed: {
     ...mapState(['user']),
@@ -235,6 +230,9 @@ export default {
     background: #f5f7fa;
   }
 }
+/deep/.card {
+  margin-bottom: 10px;
+}
 .splite {
   text-align: right;
   padding: 10px;
@@ -245,4 +243,11 @@ export default {
 /deep/.el-dialog__footer {
   text-align: center;
 }
+/deep/.card-header1 {
+  font-size: 14px;
+  margin: 3px 0px;
+}
+/deep/.box-card {
+  min-height: 348px;
+}
 </style>

+ 118 - 37
src/views/order/in.vue

@@ -2,23 +2,41 @@
   <div id="in">
     <el-row>
       <el-col :span="24" class="container">
-        <el-col :span="24" class="info">
-          <data-table :fields="fields" :data="list" :opera="opera" :total="total" :size="50" :step="10" @query="search" @assign="assign" @modify="modify">
+        <el-col :span="24" class="info" v-if="!flag">
+          <data-table
+            :fields="fields"
+            :data="list"
+            :opera="opera"
+            :total="total"
+            :size="50"
+            :step="10"
+            @query="search"
+            @assign="assign"
+            @modify="modify"
+            :toFormat="roleSelect"
+          >
             <template #options="{item}">
-              <template v-if="item.model == 'name'">
-                <el-option v-for="(item, index) in nameList" :key="index" :value="item.name" :label="item.name"></el-option>
+              <template v-if="item.model == 'client'">
+                <el-option v-for="(item, index) in nameList" :key="index" :value="item.id" :label="item.name"></el-option>
               </template>
             </template>
           </data-table>
         </el-col>
+        <el-col v-else>
+          <inDetail v-model="detailForm" @toReturn="toReturn" :nameList="nameList"></inDetail>
+          <el-row type="flex" justify="space-around">
+            <el-col :span="4">
+              <el-button type="primary" @click="toSave(detailForm)">保存</el-button>
+            </el-col>
+          </el-row>
+        </el-col>
       </el-col>
     </el-row>
-    <el-dialog :visible.sync="dialog" title="客户合同详情" @close="toClose" width="50%">
-      <!-- 物流里面的:data要换成v-model -->
-      <data-form v-model="form" :fields="formFields" :rules="rules" @save="turnSave" :submitText="submitText">
+    <el-dialog :visible.sync="dialog" title="指派负责人" @close="toClose" width="50%">
+      <data-form v-model="form" :fields="fields" :rules="rules" @save="turnSave" :submitText="submitText">
         <template #options="{item}">
-          <template v-if="item.model == 'charge'">
-            <el-option v-for="(item, index) in chargeList" :key="index" :value="item.name" :label="item.name"></el-option>
+          <template v-if="item.model == 'principal'">
+            <el-option v-for="(item, index) in chargeList" :key="index" :value="item.id" :label="item.name"></el-option>
           </template>
         </template>
       </data-form>
@@ -27,61 +45,99 @@
 </template>
 
 <script>
+const { mapActions: client } = createNamespacedHelpers('client');
+const { mapActions: order } = createNamespacedHelpers('order');
+const { mapActions: user } = createNamespacedHelpers('user');
 import { mapState, createNamespacedHelpers } from 'vuex';
+import inDetail from './inDetail.vue';
 export default {
   metaInfo() {
     return { title: this.$route.meta.title };
   },
   name: 'in',
   props: {},
-  components: {},
+  components: {
+    inDetail,
+  },
   data: function() {
     return {
       // todialog: true,
       fields: [
-        { label: '订单号', model: 'num', filter: 'input' },
-        { label: '客户', model: 'name', filter: 'select' },
-        { label: '要求发货日期', model: 'time', filter: 'date' },
-        { label: '状态', model: 'sate' },
-      ],
-      list: [
+        { label: '订单号', model: 'order_no', filter: 'input', noform: true },
+        { label: '客户', model: 'client', filter: 'select', format: true, noform: true },
+        { label: '要求发货日期', model: 'rq_send_time', filter: 'date', noform: true },
+        { label: '当前订单负责人', model: 'principal', notable: true, type: 'select' },
         {
-          num: '66464',
-          name: '伟巴斯特(长春)车顶系统有限公司-北京天津线',
-          time: '2020-2-14',
-          sate: '到达',
-        },
-        {
-          num: '66464',
-          name: '伟巴斯特(长春)车顶系统有限公司-北京天津线',
-          time: '2020-2-14',
-          sate: '到达',
+          label: '状态',
+          model: 'status',
+          filter: 'select',
+          type: 'select',
+          noform: true,
+          format: i => (i === '0' ? '使用' : '禁用'),
+          list: [
+            { label: '使用', value: '0' },
+            { label: '禁用', value: '1' },
+          ],
         },
       ],
+      list: [],
       total: 0,
       opera: [
         { label: '修改收入', method: 'modify' },
         { label: '指派负责人', method: 'assign' },
       ],
       //客戶列表
-      nameList: [{ name: '公司1' }, { name: '公司2' }, { name: '公司3' }, { name: '公司4' }, { name: '公司5' }],
+      nameList: [],
       dialog: false,
+      flag: false,
       form: {},
       formFields: [{ label: '负责人', model: 'charge', type: 'select' }],
       rules: {
-        charge: [{ required: true, message: '请选择指派负责人', trigger: 'blur' }],
+        principal: [{ required: true, message: '请选择指派负责人', trigger: 'blur' }],
       },
       //指派负责人列表
-      chargeList: [{ name: '张三' }, { name: '李四' }],
+      chargeList: [],
       submitText: '指派',
+      detailForm: {},
     };
   },
-  created() {},
+  created() {
+    this.search();
+    this.searchUser();
+  },
   methods: {
-    async search() {
-      console.log('查询');
+    ...client({ clientQuery: 'query' }),
+    ...user({ userQuery: 'query' }),
+    ...order(['query', 'create', 'update', 'delete', 'fetch']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      //查订单
+      const res = await this.query({ skip, limit, ...info });
+      // console.log(res.data);
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `list`, data);
+        this.$set(this, `total`, total);
+      }
+      //查客户列表
+      const res1 = await this.clientQuery({ type: '客户' });
+      if (this.$checkRes(res1)) {
+        const { data, total } = res1;
+        this.$set(this, `nameList`, data);
+      }
     },
-    assign() {
+    async searchUser() {
+      const res = await this.userQuery();
+      if (this.$checkRes(res)) {
+        this.$set(this, `chargeList`, res.data);
+      }
+    },
+    async assign({ data }) {
+      if (data.id) {
+        const res = await this.fetch(data.id);
+        this.$set(this, `form`, res);
+        let user = this.nameList.find(i => i.id == res.principal);
+        if (user) return user.name;
+      }
       this.dialog = true;
     },
     //关闭
@@ -89,12 +145,37 @@ export default {
       this.dialog = false;
     },
     //保存
-    turnSave(data) {
-      console.log(data);
+    turnSave({ data }) {
+      if (data) {
+        console.log(data);
+        console.log(this.form);
+      }
     },
     //修改收入
-    modify() {
-      this.$router.push({ path: '/order/inDetail' });
+    async modify({ data }) {
+      const res = await this.fetch(data.id);
+      if (res) this.$set(this, `detailForm`, res);
+      this.flag = true;
+    },
+    toReturn() {
+      this.flag = false;
+      this.detailForm = {};
+    },
+    async toSave(data) {
+      console.log(data);
+      if (data.id) {
+        const res = await this.update(data);
+        if (this.$checkRes(res, '修改成功', res.errmsg || '修改失败')) {
+          this.search();
+          this.flag = false;
+        }
+      }
+    },
+    roleSelect({ model, value }) {
+      if (model == 'client') {
+        let arr = this.nameList.find(i => i.id === value);
+        if (arr) return arr.name;
+      }
     },
   },
   computed: {

+ 299 - 202
src/views/order/inDetail.vue

@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="24" class="detail">
         <el-col :span="24" class="top">
-          <el-button size="mini" type="primary" @click="$router.go(-1)">返回</el-button>
+          <el-button size="mini" type="primary" @click="toReturn">返回</el-button>
           <span>收入详情</span>
         </el-col>
         <el-col :span="24" class="rate">
@@ -16,24 +16,24 @@
         <el-col :span="12" class="form">
           <el-form ref="form" :model="detailForm" label-width="90px">
             <el-form-item label="订单">
-              {{ detailForm.number }}
+              {{ detailForm.order_no }}
             </el-form-item>
             <el-form-item label="客户">
-              {{ detailForm.name }}
+              {{ name }}
             </el-form-item>
             <el-form-item label="合同">
-              <el-select v-model="detailForm.contract" placeholder="请选择合同">
-                <el-option v-for="(item, index) in contractList" :key="index" :label="item.name" :value="item.name"></el-option>
+              <el-select v-model="detailForm.treaty" placeholder="请选择合同" @change="treayChange">
+                <el-option v-for="(item, index) in contractList" :key="index" :label="item.number" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item label="项目">
-              <el-select v-model="detailForm.project" placeholder="请选择合同">
-                <el-option v-for="(item, index) in projectList" :key="index" :label="item.name" :value="item.name"></el-option>
+              <el-select v-model="detailForm.item" placeholder="请选择项目" @change="projectChange">
+                <el-option v-for="(item, index) in projectList" :key="index" :label="item.name" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item label="项目线路">
-              <el-select v-model="detailForm.route" placeholder="请选择合同">
-                <el-option v-for="(item, index) in routeList" :key="index" :label="item.name" :value="item.name"></el-option>
+              <el-select v-model="detailForm.route" placeholder="请选择线路" @change="routeChange">
+                <el-option v-for="(item, index) in routeList" :key="index" :label="item.name" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
           </el-form>
@@ -41,25 +41,37 @@
         <el-col :span="17" class="list">
           <el-tabs v-model="activeName">
             <el-tab-pane label="货物列表" name="first">
-              <el-table :data="detailList" border show-summary style="width: 100%">
+              <el-table :data="detailForm.goods" border show-summary style="width: 100%">
                 <el-table-column prop="name" label="货物名称"> </el-table-column>
-                <el-table-column prop="way" label="计费方式">
+                <el-table-column prop="mode" label="计费方式">
                   <template slot-scope="scope">
-                    <el-select v-model="scope.row.way" placeholder="请选择" @change="change">
-                      <el-option v-for="item in wayoptions" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+                    <el-select
+                      v-model="scope.row.mode"
+                      placeholder="请选择"
+                      @change="
+                        val => {
+                          change(val, scope.$index);
+                        }
+                      "
+                    >
+                      <el-option v-for="(item, index) in wayList" :key="index" :label="item.hh" :value="item.id"> </el-option>
                     </el-select>
                   </template>
                 </el-table-column>
+                <el-table-column prop="taxes" label="税率"
+                  ><template slot-scope="scope">
+                    {{ scope.row.taxes }}
+                  </template>
+                </el-table-column>
                 <el-table-column prop="price" label="单价"> </el-table-column>
-                <el-table-column prop="rate" label="税率"> </el-table-column>
-                <el-table-column prop="num" label="数量"> </el-table-column>
-                <el-table-column prop="before" label="税前应收"> </el-table-column>
-                <el-table-column prop="after" label="税后应收"> </el-table-column>
-                <el-table-column prop="paidBefor" label="税前实收"> </el-table-column>
-                <el-table-column prop="paidAfter" label="税后实收"> </el-table-column>
-                <el-table-column prop="desc" label="备注">
+                <el-table-column prop="cvalue" label="数量"> </el-table-column>
+                <el-table-column prop="sq_ys" label="税前应收"> </el-table-column>
+                <el-table-column prop="sh_ys" label="税后应收"> </el-table-column>
+                <el-table-column prop="sq_ss" label="税前实收"> </el-table-column>
+                <el-table-column prop="sh_ss" label="税后实收"> </el-table-column>
+                <el-table-column align="center" label="备注" prop="remark">
                   <template slot-scope="scope">
-                    <el-input type="textarea" placeholder="请输入备注" v-model="scope.row.desc"> </el-input>
+                    <el-input type="textarea" v-model="scope.row.remark" placeholder="请输入备注"></el-input>
                   </template>
                 </el-table-column>
               </el-table>
@@ -69,18 +81,18 @@
                 <el-button type="primary" @click="addGoods">添加收费项</el-button>
               </el-col>
               <el-col :span="24">
-                <el-table :data="listData" stripe border show-summary>
-                  <el-table-column align="center" label="收入项" prop="income">
+                <el-table :data="detailForm.in_bill" stripe border show-summary>
+                  <el-table-column align="center" label="收入项" prop="item">
                     <template slot-scope="scope">
-                      <el-select v-model="scope.row.income" placeholder="请选择">
-                        <el-option v-for="item in options" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+                      <el-select v-model="scope.row.item" placeholder="请选择">
+                        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
                       </el-select>
                     </template>
                   </el-table-column>
                   <el-table-column align="center" label="税率">
                     <template slot-scope="scope">
                       <el-select
-                        v-model="scope.row.rate"
+                        v-model="scope.row.taxes"
                         placeholder="请选择"
                         @change="
                           val => {
@@ -88,14 +100,14 @@
                           }
                         "
                       >
-                        <el-option v-for="item in rateList" :key="item.name" :label="item.name" :value="item.name"> </el-option>
+                        <el-option v-for="item in rateList" :key="item.label" :label="item.label" :value="item.label"> </el-option>
                       </el-select>
                     </template>
                   </el-table-column>
-                  <el-table-column align="center" label="税前应收" prop="before">
+                  <el-table-column align="center" label="税前应收" prop="sq_ys">
                     <template slot-scope="scope">
                       <el-input
-                        v-model="scope.row.before"
+                        v-model="scope.row.sq_ys"
                         placeholder="请输入税前应收"
                         @change="
                           val => {
@@ -105,15 +117,15 @@
                       ></el-input>
                     </template>
                   </el-table-column>
-                  <el-table-column align="center" label="税后应收" prop="after">
+                  <el-table-column align="center" label="税后应收" prop="sh_ys">
                     <template slot-scope="scope">
-                      <el-input v-model="scope.row.after" readonly></el-input>
+                      <el-input v-model="scope.row.sh_ys" readonly></el-input>
                     </template>
                   </el-table-column>
-                  <el-table-column align="center" label="税前实收" prop="paidBefor">
+                  <el-table-column align="center" label="税前实收" prop="sq_ss">
                     <template slot-scope="scope">
                       <el-input
-                        v-model="scope.row.paidBefor"
+                        v-model="scope.row.sq_ss"
                         placeholder="请输入税前实收"
                         @change="
                           val => {
@@ -123,16 +135,16 @@
                       ></el-input>
                     </template>
                   </el-table-column>
-                  <el-table-column align="center" label="税后实收" prop="paidAfter">
+                  <el-table-column align="center" label="税后实收" prop="sh_ss">
                     <template slot-scope="scope">
-                      <el-input v-model="scope.row.paidAfter" readonly></el-input>
+                      <el-input v-model="scope.row.sh_ss" readonly></el-input>
                     </template>
                   </el-table-column>
-                  <el-table-column align="center" label="备注" prop="desc">
+                  <!-- <el-table-column align="center" label="备注" prop="remark">
                     <template slot-scope="scope">
-                      <el-input type="textarea" v-model="scope.row.desc" placeholder="请输入备注"></el-input>
+                      <el-input type="textarea" v-model="scope.row.remark" placeholder="请输入备注"></el-input>
                     </template>
-                  </el-table-column>
+                  </el-table-column> -->
                   <el-table-column align="center" label="操作" width="70px">
                     <template slot-scope="scope">
                       <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
@@ -142,11 +154,7 @@
               </el-col>
             </el-tab-pane>
           </el-tabs>
-          <el-row>
-            <el-col :span="24" style="text-align:center;margin:40px 0px">
-              <el-button type="primary" size="mini" @click="save()">保存</el-button>
-            </el-col>
-          </el-row>
+          <el-row> </el-row>
         </el-col>
       </el-col>
     </el-row>
@@ -154,221 +162,307 @@
 </template>
 
 <script>
+const { mapActions: project } = createNamespacedHelpers('project');
+const { mapActions: route } = createNamespacedHelpers('route');
+const { mapActions: mode } = createNamespacedHelpers('mode');
+const { mapActions: treaty } = createNamespacedHelpers('treaty');
+const { mapActions: dictionary } = createNamespacedHelpers('dictionary');
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
   metaInfo() {
     return { title: this.$route.meta.title };
   },
   name: 'inDetail',
-  props: {},
+  props: {
+    detailForm: { type: Object },
+    nameList: { type: Array },
+  },
+  model: {
+    prop: 'detailForm',
+    event: 'change',
+  },
   components: {},
   data: function() {
     return {
-      detailForm: { name: '伟巴斯特(长春)车顶系统有限公司-北京天津线', number: '1234', contract: '合同一', route: '线路一', project: '项目一' },
+      // detailForm1: { name: '伟巴斯特(长春)车顶系统有限公司-北京天津线', number: '1234', contract: '合同一', route: '线路一', project: '项目一' },
       //合同列表
       contractList: [],
       //项目列表
       projectList: [],
       //线路列表
-      routeList: [{ name: '线路二' }],
-      detailFields: [
-        { label: '货物名称', model: 'name' },
-        { label: '计费方式', model: 'way' },
-        { label: '单价', model: 'price' },
-        { label: '税率', model: 'rate', custom: 'true' },
-        { label: '税前应收', model: 'before' },
-        { label: '税后应收', model: 'after' },
-        { label: '税前实收', model: 'paidBefor' },
-        { label: '税后应收', model: 'paidAfter' },
-        { label: '备注', model: 'desc', custom: 'true' },
-      ],
-      detailList: [
-        {
-          name: '1',
-          way: '整车-100',
-          price: '',
-          before: '',
-          after: '',
-          paidBefor: '',
-          paidAfter: '',
-          rate: 1.1,
-          num: 20,
-        },
-      ],
+      routeList: [],
+      detailList: [],
       activeName: 'first',
       //收入项列表
-      options: [{ name: '保费' }, { name: '提送货费' }, { name: '运费' }],
+      options: [],
       //税率列表
-      rateList: [{ name: '1' }, { name: '1.1' }, { name: '2' }],
+      rateList: [],
       listData: [],
-      wayoptions: [{ name: '整车-100' }, { name: '零担-10' }],
+      //方式列表
+      wayoptions: [],
       cost1: 0,
       cost2: 0,
       cost3: 0,
       cost4: 0,
+      name: '',
+      treatyValue: '',
+      routeValue: '',
+      wayValue: '',
+      priceOptions: [],
+      prNumber: '',
+      wayList: [],
+      //单价列表
+      priceList: [],
+      number1: 0,
+      weight: 0,
+      volume: 0,
+      projectObj: {},
     };
   },
-  created() {
-    this.change(this.detailList[0].way);
-    // this.all();
-    this.cost1 = this.detailList[0].before;
-    this.cost2 = this.detailList[0].after;
-    this.cost3 = this.detailList[0].paidBefor;
-    this.cost4 = this.detailList[0].paidAfter;
+  async created() {
+    await this.roleSelect(this.detailForm.client);
+    await this.search();
+    await this.searchTree();
+    await this.isTreaty();
+    // await this.assign();
+    // this.ifMode();
+    await this.computRate();
+    console.log(this.detailForm);
   },
   methods: {
+    //查合同
+    ...treaty(['query', 'create', 'update', 'delete']),
+    ...project({ projectQuery: 'query' }),
+    ...route({ routeQuery: 'query' }),
+    ...mode({ modeQuery: 'query' }),
+    ...dictionary(['tree']),
+
+    async search() {
+      let client = this.detailForm.client;
+      let obj = {};
+      if (this.user.role !== '0') obj.owner = this.user.id;
+      obj.client = client;
+      const res = await this.query(obj);
+      if (res.data.length == 0) {
+        this.projectList = [];
+        this.routeList = [];
+        this.contractList = [];
+        this.detailForm.item = '';
+        this.detailForm.route = '';
+        this.detailForm.treaty = '';
+      } else {
+        const { data, total } = res;
+        this.$set(this, `contractList`, data);
+      }
+    },
+    //查项目
+    async searchProject() {
+      // console.log('查项目');
+      let goods = this.detailForm.goods;
+      const res = await this.projectQuery({ treaty: this.treatyValue });
+      // console.log(res);
+      if (res.data.length == 0) {
+        this.projectList = [];
+        this.routeList = [];
+        this.detailForm.item = '';
+        this.detailForm.route = '';
+      } else {
+        const { data, total } = res;
+        this.$set(this, `projectList`, data);
+      }
+    },
+    //查线路
+    async searchRoute() {
+      const res = await this.routeQuery({ item: this.routeValue });
+      if (res.data.length == 0) {
+        this.routeList = [];
+        this.detailForm.route = '';
+      } else {
+        const { data } = res;
+        this.$set(this, `routeList`, data);
+      }
+    },
+    //查计费方式列表
+    async searchWay() {
+      // let hh;
+      let test1 = [];
+      const res = await this.modeQuery({ route: this.wayValue });
+      if (res) {
+        this.$set(this, `wayList`, res.data);
+        for (let i of this.wayList) {
+          if (i.is_lf) {
+            i.hh = `${i.price}-量份`;
+          } else if (i.send_type == '零担') {
+            i.hh = `${i.price}-${i.send_type}-${i.computed_type}`;
+          } else {
+            i.hh = `${i.price}-整车`;
+          }
+          // test1.push(hh);
+        }
+        // let newTest = _.slice(test1, 0, this.wayList.length + 1);
+        // this.$set(this, `wayoptions`, newTest);
+        // console.log(this.wayList);
+      }
+    },
+    async searchTree() {
+      //查询其他收费项
+      const res = await this.tree('sr');
+      if (res) {
+        this.$set(this, `options`, res[0].children);
+        // console.log(this.options);
+      }
+      //查其他收费项的税率
+      const res1 = await this.tree('sl');
+      if (res1) {
+        this.$set(this, `rateList`, res1[0].children);
+      }
+    },
     handleChange(value) {
       console.log(value);
     },
     //添加收費項目
     addGoods() {
-      this.listData.push({});
+      this.detailForm.in_bill.push({ taxes: 1, item: '保費' });
     },
     //刪除
     handleDelete(index, row) {
-      if (index >= 0) {
-        this.cost1 = _.round(this.cost1 - Number(row.before), 2);
-        this.cost2 = _.round(this.cost2 - Number(row.after), 2);
-        this.cost3 = _.round(this.cost3 - Number(row.paidBefor), 2);
-        this.cost4 = _.round(this.cost4 - Number(row.paidAfter), 2);
-        if (index > -1) {
-          this.listData.splice(index, 1);
-        }
+      if (index > -1) {
+        this.detailForm.in_bill.splice(index, 1);
       }
+      this.computRate();
     },
-    //选择计费方式
-    change(data) {
-      const arr = _.split(data, '-', 2);
-      this.detailList[0].price = Number(arr[arr.length - 1]);
-      if (arr.indexOf('整车') != -1) {
-        this.detailList[0].num = 1;
+    //选择货物的计费方式
+    async change(data, index) {
+      let priceDate = this.wayList.find(i => i.id === data);
+      // console.log(priceDate);
+      let goods = this.detailForm.goods[index];
+      let price = priceDate.hh.split('-');
+      goods.price = price[0];
+      // console.log(goods);
+      let arr = _.split(priceDate.hh, '-', 3);
+      // console.log(arr);
+      if (_.indexOf(arr, '量份') !== -1) {
+        goods.cvalue = goods.number;
+      } else if (_.indexOf(arr, '整车') !== -1) {
+        goods.cvalue = 1;
+      } else if (_.indexOf(arr, '按体积') !== -1) {
+        console.log('按体积');
+        goods.cvalue = goods.volume;
       } else {
-        this.detailList[0].num = 9;
+        console.log('按重量');
+        goods.cvalue = goods.weight;
       }
-      this.computRate(this.detailList[0].price, this.detailList[0].num);
+      goods.sq_ys = _.round(goods.cvalue * goods.price, 2);
+      goods.sh_ys = _.round(goods.taxes * goods.cvalue * goods.price, 2);
+      goods.sq_ss = _.round(goods.cvalue * goods.price, 2);
+      goods.sh_ss = _.round(goods.taxes * goods.cvalue * goods.price, 2);
+      // console.log(goods);
+      this.$set(this.detailForm.goods, index, goods);
+
+      this.computRate();
     },
     //計算价格
-    computRate(price, num) {
-      const listData = this.detailList[0];
-      if (Number(listData.rate) != 0) {
-        listData.before = price * num;
-        listData.paidBefor = price * num;
-        listData.after = _.round(listData.rate * listData.before);
-        listData.paidAfter = _.round(listData.rate * listData.paidBefor);
-      } else {
-        listData.before = price * num;
-        listData.paidBefor = price * num;
-        listData.after = '0';
-        listData.paidAfter = '0';
+    async computRate() {
+      let num1 = 0;
+      let num2 = 0;
+      let num3 = 0;
+      let num4 = 0;
+      let num5 = 0;
+      let num6 = 0;
+      let num7 = 0;
+      let num8 = 0;
+      let goods = this.detailForm.goods; //goods是个数组
+      let in_bill = this.detailForm.in_bill; //in_bill是个数组
+      for (let row1 of goods) {
+        num1 = _.round(num1 + row1.sq_ys, 2);
+        num2 = _.round(num2 + row1.sh_ys, 2);
+        num3 = _.round(num3 + row1.sq_ss, 2);
+        num4 = _.round(num4 + row1.sh_ss, 2);
+      }
+      for (let val of in_bill) {
+        num5 = _.round(num5 + Number(val.sq_ys), 2);
+        num6 = _.round(num6 + val.sh_ys, 2);
+        num7 = _.round(num7 + Number(val.sq_ss), 2);
+        num8 = _.round(num8 + val.sh_ss, 2);
       }
-      this.cost1 = listData.before;
-      this.cost2 = listData.after;
-      this.cost3 = listData.paidBefor;
-      this.cost4 = listData.paidAfter;
+      this.$set(this, `cost1`, _.round(num1 + num5, 2));
+      this.$set(this, `cost2`, _.round(num2 + num6, 2));
+      this.$set(this, `cost3`, _.round(num3 + num7, 2));
+      this.$set(this, `cost4`, _.round(num4 + num8, 2));
     },
     //税前应收
     inputChange(val, index) {
-      const rateList = this.listData[index];
-      if (rateList.rate && rateList.before) {
-        const after1 = _.round(Number(val) * rateList.rate, 2);
-        this.$set(rateList, `after`, after1);
-        this.$set(rateList, `paidBefor`, Number(val));
-        this.$set(rateList, `paidAfter`, after1);
-        //当只建立一条数据的时候
-        if (this.listData.length == 1) {
-          if (this.cost1 == this.detailList[0].before) {
-            console.log('jianli1');
-            this.cost1 += Number(rateList.before);
-            this.cost2 += Number(rateList.after);
-            this.cost3 += Number(rateList.paidBefor);
-            this.cost4 += Number(rateList.paidAfter);
-          } else {
-            console.log('不是一地辞了');
-            this.cost1 = _.round(this.detailList[0].before + Number(rateList.before), 2);
-            this.cost2 = _.round(this.detailList[0].after + rateList.after, 2);
-            this.cost3 = _.round(this.detailList[0].paidBefor + rateList.paidBefor, 2);
-            this.cost4 = _.round(this.detailList[0].paidAfter + rateList.paidAfter, 2);
-          }
-        } else {
-          //建立多条数据的时候
-          let num1 = this.detailList[0].before;
-          let num2 = this.detailList[0].after;
-          let num3 = this.detailList[0].paidBefor;
-          let num4 = this.detailList[0].paidAfter;
-          //判断是否有建立数据但是没有填写内容的
-          for (let item of this.listData) {
-            // let arr = Object.keys(item);
-            if (item.before) {
-              num1 = _.round(num1 + Number(item.before), 2);
-              num2 = _.round(num2 + Number(item.after), 2);
-              num3 = _.round(num3 + Number(item.paidBefor), 2);
-              num4 = _.round(num4 + Number(item.paidAfter), 2);
-            } else {
-              // item.before = '';
-              // item.after = '';
-              // item.paidBefor = '';
-              // item.paidAfter = '';
-            }
-          }
-          this.cost1 = num1;
-          this.cost2 = num2;
-          this.cost3 = num3;
-          this.cost4 = num4;
-        }
-      }
+      let bill = this.detailForm.in_bill[index]; //bill是数组
+      let sh_ys = _.round(bill.sq_ys * bill.taxes, 2);
+      this.$set(bill, `sh_ys`, sh_ys);
+      let sq_ss = _.round(bill.sq_ys, 2);
+      this.$set(bill, `sq_ss`, sq_ss);
+      let sh_ss = _.round(bill.sq_ss * bill.taxes, 2);
+      this.$set(bill, `sh_ss`, sh_ss);
+      this.computRate();
     },
     //税前实收
     otherChange(val, index) {
-      const rateList = this.listData[index];
-      if (rateList.rate != 0) {
-        const paidAfter1 = _.round(Number(val) * rateList.rate, 2);
-        this.$set(rateList, `paidAfter`, paidAfter1);
-        if (this.listData.length == 1) {
-          this.cost3 = _.round(this.detailList[0].paidBefor + Number(rateList.paidBefor), 2);
-          this.cost4 = _.round(this.detailList[0].paidAfter + rateList.paidAfter, 2);
-        } else {
-          //建立多条数据的时候
-          let num3 = this.detailList[0].paidBefor;
-          let num4 = this.detailList[0].paidAfter;
-          for (let item of this.listData) {
-            num3 = _.round(num3 + Number(item.paidBefor), 2);
-            num4 = _.round(num4 + Number(item.paidAfter), 2);
-          }
-          this.cost3 = num3;
-          this.cost4 = num4;
-        }
-      }
+      console.log(val, index);
+      let bill = this.detailForm.in_bill[index]; //bill是数组
+      let sh_ss = _.round(bill.sq_ss * bill.taxes, 2);
+      this.$set(bill, `sh_ss`, sh_ss);
+      this.computRate();
     },
     //选择税率
     selectChange(val, index) {
-      const rateList = this.listData[index];
-      if (rateList.rate && rateList.before) {
-        const data = _.round(Number(val) * rateList.before, 2);
-        this.$set(rateList, `after`, data);
-        const data1 = _.round(Number(val) * rateList.paidBefor, 2);
-        this.$set(rateList, `paidAfter`, data1);
-        if (this.listData.length == 1) {
-          this.cost2 = rateList.after + this.detailList[0].after;
-          this.cost4 = rateList.paidAfter + this.detailList[0].paidAfter;
-        } else {
-          //建立多条数据的时候
-          let num2 = this.detailList[0].after;
-          let num4 = this.detailList[0].paidAfter;
-          for (let item of this.listData) {
-            console.log(item);
-            num2 = _.round(num2 + Number(item.after), 2);
-            num4 = _.round(num4 + Number(item.paidAfter), 2);
-          }
-          this.cost2 = num2;
-          this.cost4 = num4;
-        }
-      }
+      let bill = this.detailForm.in_bill[index]; //bill是数组
+      this.inputChange(val, index);
     },
     //保存
     save() {
       console.log('保存');
       console.log(this.listData);
     },
+    //返回
+    toReturn() {
+      this.$emit('toReturn');
+    },
+    roleSelect(value) {
+      let arr = this.nameList.find(i => i.id === value);
+      this.name = arr.name;
+    },
+    //合同改变
+    async treayChange(data) {
+      this.treatyValue = data;
+      await this.searchProject();
+    },
+    //项目改变  项目改变就有税率
+    async projectChange(data) {
+      this.$set(this, `routeValue`, data);
+      await this.searchRoute();
+      const res = this.projectList.find(f => f.id == data);
+      if (res) {
+        const { taxes } = res;
+        let duplicate = _.cloneDeep(this.detailForm.goods);
+        duplicate = duplicate.map(i => {
+          i.taxes = taxes;
+          return i;
+        });
+        this.$set(this.detailForm, `goods`, duplicate);
+      }
+    },
+    //线路改变
+    routeChange(data, type) {
+      this.wayValue = data;
+      this.searchWay();
+      console.log(data);
+      if (type) return;
+      for (let item of this.detailForm.goods) {
+        item.mode = '';
+      }
+    },
+    async isTreaty() {
+      if (this.detailForm.treaty) this.treayChange(this.detailForm.treaty);
+      if (this.detailForm.item) this.projectChange(this.detailForm.item);
+      //判断是不是第一次进入,如果是第一次那么不清空,如果是自己手动触发则要清空
+      if (this.detailForm.route) await this.routeChange(this.detailForm.route, true);
+    },
   },
   computed: {
     ...mapState(['user']),
@@ -422,4 +516,7 @@ export default {
 /deep/.el-table .cell {
   text-align: center;
 }
+/deep/.el-input__inner {
+  text-align: center;
+}
 </style>

+ 90 - 35
src/views/order/transport/index.vue

@@ -5,15 +5,34 @@
         <el-col :span="24" class="container">
           <el-col :span="24" class="info">
             <!-- :select="true"在前面加上复选框  @handleSelect="toSelect"给复选框添加点击事件,如果想要点击事件好用的话列表必须给一个id要不然点击区分不了是不是同一个数据-->
-            <data-table :fields="fields" :data="list" :total="total" :size="50" :step="10" :select="true" @handleSelect="toSelect" v-if="!dialog">
+            <!-- <data-table :fields="fields" :data="list" :total="total" :size="50" :step="10" :select="true" @handleSelect="toSelect" v-if="!dialog">
               <template #filterEnd>
                 <el-button v-if="selected.length <= 0" type="primary" :disabled="true">未选择</el-button>
                 <el-button v-else type="primary" @click="toExport">发车</el-button>
               </template>
-            </data-table>
+            </data-table> -->
+            <el-row :gutter="20" v-if="!dialog">
+              <el-col :span="24" style="text-align:center;margin-bottom:10px">
+                <el-button v-if="selected.length <= 0" type="primary" :disabled="true">未选择</el-button>
+                <el-button v-else type="primary" @click="toExport">发车</el-button>
+              </el-col>
+              <el-col :span="12" class="card" v-for="(item, index) in list" :key="index">
+                <el-card class="box-card">
+                  <div slot="header" class="clearfix">
+                    <el-row :gutter="10">
+                      <el-col class="card-header1" :span="24">订单号:{{ item.order_no }}</el-col>
+                      <el-col class="card-header1" :span="24">客户:{{ getclient(item.client) }}</el-col>
+                      <el-col class="card-header1" :span="24">线路:{{ getroute(item.route) }}</el-col>
+                    </el-row>
+                  </div>
+                  <data-table height="200px" :fields="fields" :data="item.goods" :usePage="false" :opera="opera" @handleSelect="toSelect" :select="true">
+                  </data-table>
+                </el-card>
+              </el-col>
+            </el-row>
             <el-col :span="24" class="detail" v-else>
               <el-col :span="24" class="top">
-                <el-button size="mini" type="primary" @click="$router.go(-1)">返回</el-button>
+                <el-button size="mini" type="primary" @click="back()">返回</el-button>
                 <span>填写装车单</span>
               </el-col>
               <el-col :span="12" class="form">
@@ -71,6 +90,10 @@
 
 <script>
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: order } = createNamespacedHelpers('order');
+const { mapActions: client } = createNamespacedHelpers('client');
+const { mapActions: route } = createNamespacedHelpers('route');
+
 export default {
   metaInfo() {
     return { title: this.$route.meta.title };
@@ -80,42 +103,23 @@ export default {
   components: {},
   data: function() {
     return {
+      // 显示
       dialog: false,
+      // 客户列表
+      clientList: [],
+      // 线路列表
+      routeList: [],
+      // 订单列表
       fields: [
-        { label: '订单号', model: 'ordernum' },
-        { label: '拆分单号', model: 'spilt' },
-        { label: '货物', model: 'goods' },
-        { label: '运输费用', model: 'cost' },
+        { label: '货物', model: 'name' },
         { label: '数量', model: 'number' },
-        { label: '重量(t)', model: 'weight' },
-        { label: '体积(m²)', model: 'volume' },
-        { label: '要求发货日期', model: 'time' },
-      ],
-      list: [
-        {
-          id: '1',
-          ordernum: '123',
-          spilt: 'AW-YS-ZF-2018-005',
-          goods: '真皮',
-          cost: '40',
-          number: '3',
-          weight: '40',
-          volume: '50',
-          time: '2020-01-09',
-        },
-        {
-          id: '2',
-          ordernum: '123',
-          spilt: 'AW-YS-ZF-2018-005',
-          goods: '真皮',
-          cost: '40',
-          number: '3',
-          weight: '40',
-          volume: '50',
-          time: '2020-01-09',
-        },
+        { label: '重量', model: 'weight' },
+        { label: '体积', model: 'volume' },
+        { label: '备注', model: 'remark' },
       ],
+      list: [],
       total: 0,
+      opera: [],
       selected: [],
       form: {
         number: 123566,
@@ -151,8 +155,34 @@ export default {
       ],
     };
   },
-  created() {},
+  async created() {
+    await this.search();
+  },
   methods: {
+    ...order(['query', 'create', 'update', 'delete', 'fetch']),
+    ...client({ clientQuery: 'query' }),
+    ...route({ routeQuery: 'query' }),
+    async search({ skip = 0, limit = 8, ...info } = {}) {
+      //查订单
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `list`, data);
+        this.$set(this, `total`, total);
+      }
+      //查客户列表
+      res = await this.clientQuery({ type: '客户' });
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `clientList`, data);
+      }
+      // 查询线路列表
+      res = await this.routeQuery();
+      if (this.$checkRes(res)) {
+        const { data, total } = res;
+        this.$set(this, `routeList`, data);
+      }
+    },
     toSelect(data) {
       // console.log(data);
       this.selected = data;
@@ -166,6 +196,21 @@ export default {
     create(data, detailList) {
       console.log(data, detailList);
     },
+    // 查询客户
+    getclient(value) {
+      const res = this.clientList.find(i => i.id === value);
+      if (res) return res.name;
+    },
+    // 查询线路
+    getroute(value) {
+      const res = this.routeList.find(i => i.id === value);
+      if (res) return res.name;
+    },
+    // 返回列表
+    back() {
+      this.selected = [];
+      this.dialog = false;
+    },
   },
   computed: {
     ...mapState(['user']),
@@ -197,4 +242,14 @@ export default {
   margin: 30px 0px;
   text-align: center;
 }
+/deep/.card-header1 {
+  font-size: 14px;
+  margin: 3px 0px;
+}
+/deep/.box-card {
+  min-height: 348px;
+}
+/deep/.card {
+  margin-bottom: 10px;
+}
 </style>

+ 8 - 3
src/views/order/transport/sign.vue

@@ -25,6 +25,7 @@
 
 <script>
 import { mapState, createNamespacedHelpers } from 'vuex';
+// const { mapActions: order } = createNamespacedHelpers('order');
 export default {
   metaInfo() {
     return { title: this.$route.meta.title };
@@ -97,10 +98,14 @@ export default {
       backup: '',
     };
   },
-  created() {},
+  async created() {
+    await this.search();
+  },
   methods: {
-    async search() {
-      console.log('查询');
+    // ...order(['query', 'create', 'update', 'delete']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      console.log(res);
     },
     //关闭
     toClose() {

+ 2 - 0
src/views/supplier/contract.vue

@@ -69,6 +69,7 @@ export default {
         { label: '合同周期', model: 'period' },
         { label: '结算方式', model: 'settle_up' },
         { label: '结算周期', model: 'settle_up_period' },
+        { label: '截止日期', model: 'expiry_date', type: 'date' },
         {
           label: '状态',
           model: 'status',
@@ -100,6 +101,7 @@ export default {
         settle_up: [{ required: true, message: '请输入结算方式', trigger: 'blur' }],
         settle_up_period: [{ required: true, message: '请输入结算周期', trigger: 'blur' }],
         status: [{ required: true, message: '请选择状态', trigger: 'blur' }],
+        expiry_date: [{ required: true, message: '请选择截止日期', trigger: 'blur' }],
       },
       //供應商列表
       nameList: [],