Преглед изворни кода

修改10.13和10.20部署的问题

yuhan пре 1 година
родитељ
комит
730668fc3d
22 измењених фајлова са 3119 додато и 307 уклоњено
  1. 3 0
      src/api/kzksApi.js
  2. 436 0
      src/views/module_kzks/costModelClYushi/CostModelClYushi.vue
  3. 173 0
      src/views/module_kzks/costModelClYushi/modules/CostModelClYushiForm.vue
  4. 84 0
      src/views/module_kzks/costModelClYushi/modules/CostModelClYushiModal.Style#Drawer.vue
  5. 60 0
      src/views/module_kzks/costModelClYushi/modules/CostModelClYushiModal.vue
  6. 57 0
      src/views/module_kzks/costModelClYushi/modulesDetail/CostModelDetailModal.vue
  7. 50 0
      src/views/module_kzks/costModelClYushi/modulesDetail/CostModelJgModal.vue
  8. 378 0
      src/views/module_kzks/costModelClYushi/modulesDetail/CostModelXmxqClList.vue
  9. 337 0
      src/views/module_kzks/costModelClYushi/modulesDetail/CostModelXmxqWxList.vue
  10. 201 0
      src/views/module_kzks/costModelProductPrice/CostModelProductPriceList.vue
  11. 129 0
      src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceForm.vue
  12. 84 0
      src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceModal.Style#Drawer.vue
  13. 60 0
      src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceModal.vue
  14. 394 0
      src/views/module_kzks/costModelWxPriceSddr/CostModelWxPriceList.vue
  15. 153 0
      src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceForm.vue
  16. 84 0
      src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceModal.Style#Drawer.vue
  17. 60 0
      src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceModal.vue
  18. 56 3
      src/views/module_kzks/kpiImportList/KpiImportList.vue
  19. 264 262
      src/views/module_kzks/projectContrastList/allList.vue
  20. 32 28
      src/views/module_kzks/projectContrastList/components/lineBarChart.vue
  21. 20 10
      src/views/module_kzks/projectCostList/ProjectCostList.vue
  22. 4 4
      src/views/module_kzks/projectDownloadModel/ProjectDownloadModelList.vue

+ 3 - 0
src/api/kzksApi.js

@@ -25,6 +25,8 @@ const getHjList = (params)=>getAction("/projectCostHuiji/projectCostHuiji/compar
 const getDbClList = (params)=>getAction("wzOutboundOrder/wzOutboundOrderH/compareCLFDetailList", params);
 // 成本模型——通过id查询详情
 const getModalIdList = (params)=>getAction("/costModelList/costModelList/queryByIdBeforeEdit", params);
+// 加入产品价格库(模型)
+const insertIntoProject = (params)=>postAction("/projectCostHuiji/projectCostHuiji/insertIntoCostModel", params);
 
 
 // 成本模型知会
@@ -57,6 +59,7 @@ export {
   getdataByChb,
   getdataBySk,
   deptZhibiaoPaihang,
+  insertIntoProject,
 }
 
 

+ 436 - 0
src/views/module_kzks/costModelClYushi/CostModelClYushi.vue

@@ -0,0 +1,436 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="项目名称">
+              <a-input placeholder="请输入项目名称" v-model="queryParam.xmName"></a-input>
+            </a-form-item>
+          </a-col>
+          <!-- <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col> -->
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <!-- <a-button type="primary" icon="download" @click="handleExportXls('成本模型')">导出</a-button> -->
+      <!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload> -->
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <span slot="maxClf" slot-scope="text, record">
+          <a-button type="link" @click="detailClick(text,record,'clf','max','材料费最大值')">{{ text }}</a-button>
+        </span>
+        <span slot="minClf" slot-scope="text, record">
+          <a-button type="link" @click="detailClick(text,record,'clf','min','材料费最小值')">{{ text }}</a-button>
+        </span>
+        <span slot="aveClf" slot-scope="text, record">
+          <a-button type="link" @click="detailClick(text,record,'clf','ave','材料费平均值')">{{ text }}</a-button>
+        </span>
+        <span slot="recentClf" slot-scope="text, record">
+          <a-button type="link" @click="detailClick(text,record,'clf','recent','材料费近期值')">{{ text }}</a-button>
+        </span>
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleJG(record)" style="color:#FFA11E;" v-if="record.modelStatus == 1">警告</a>
+          <a-divider type="vertical" v-if="record.modelStatus == 1"/>
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <!-- <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item> -->
+              <!-- <a-menu-item>
+                <a @click="handleInform(record)">知会</a>
+              </a-menu-item> -->
+              <a-menu-item>
+                <a @click="handleExportItem(record)">导出</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <cost-model-cl-yushi-modal ref="modalForm" @ok="modalFormOk"></cost-model-cl-yushi-modal>
+
+    <j-modal
+      title="知会"
+      :width="800"
+      :visible="visibleInform"
+      switchFullscreen
+      @ok="handleOk"
+      :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+      @cancel="handleCancel"
+      cancelText="关闭">
+      <!-- <j-select-multi-user :returnKeys="returnKeys" placeholder="请选择指定用户" v-model="userIds" :trigger-change="true"></j-select-multi-user> -->
+      <j-select-user-by-dep placeholder="请选择消息接收方" v-model="receiver">1111</j-select-user-by-dep>
+    </j-modal>
+
+    <cost-model-detail-modal ref="costModelListModal"></cost-model-detail-modal>
+
+    <!-- 警告 -->
+    <cost-model-jg-modal ref="costModelJgModal"></cost-model-jg-modal>
+
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CostModelClYushiModal from './modules/CostModelClYushiModal'
+  import { costModelInform, exportXlsCbmxItem } from '@/api/kzksApi.js'
+import CostModelDetailModal from './modulesDetail/CostModelDetailModal.vue'
+import CostModelJgModal from './modulesDetail/CostModelJgModal.vue'
+
+  export default {
+    name: 'CostModelListList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      CostModelClYushiModal,
+      CostModelDetailModal,
+      CostModelJgModal
+    },
+    data () {
+      return {
+        description: '成本模型管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'项目名称',
+            align:"center",
+            dataIndex: 'xmName'
+          },
+          {
+            title:'创建人',
+            align:"center",
+            dataIndex: 'createBy'
+          },
+          // {
+          //   title:'所属部门',
+          //   align:"center",
+          //   dataIndex: 'sysOrgCode'
+          // },
+          // {
+          //   title:'知会给',
+          //   align:"center",
+          //   dataIndex: 'informTo_dictText'
+          // },
+          {
+            title:'材料费',
+            align:"center",
+            children: [
+              {
+                title:'最大值',
+                align:"center",
+                dataIndex: 'maxClf',
+                scopedSlots: {
+                  customRender: 'maxClf',
+                },
+                // customCell: this.getClickColumn,
+              },
+              {
+                title:'最小值',
+                align:"center",
+                dataIndex: 'minClf',
+                scopedSlots: {
+                  customRender: 'minClf',
+                },
+                // customCell: this.getClickColumn,
+              },
+              {
+                title:'平均值',
+                align:"center",
+                dataIndex: 'aveClf',
+                scopedSlots: {
+                  customRender: 'aveClf',
+                },
+                // customCell: this.getClickColumn,
+              },
+              {
+                title:'近期值',
+                align:"center",
+                dataIndex: 'recentClf',
+                scopedSlots: {
+                  customRender: 'recentClf',
+                },
+                // customCell: this.getClickColumn,
+              },
+            ],
+          },
+          // {
+          //   title:'外协费',
+          //   align:"center",
+          //   dataIndex: 'wxf'
+          // },
+          // {
+          //   title:'材料费',
+          //   align:"center",
+          //   dataIndex: 'clf'
+          // },
+          // {
+          //   title:'材料费类型',
+          //   align:"center",
+          //   dataIndex: 'clfType'
+          // },
+          // {
+          //   title:'事务费',
+          //   align:"center",
+          //   dataIndex: 'swf'
+          // },
+          // {
+          //   title:'专用费',
+          //   align:"center",
+          //   dataIndex: 'zyf'
+          // },
+          // {
+          //   title:'固资费', // 固定资产折旧费
+          //   align:"center",
+          //   dataIndex: 'gdzczj'
+          // },
+          // {
+          //   title:'燃动费',
+          //   align:"center",
+          //   dataIndex: 'rldlf'
+          // },
+          // {
+          //   title:'工资费', // 工资及劳务费
+          //   align:"center",
+          //   dataIndex: 'gzjlwf'
+          // },
+          // {
+          //   title:'管理费',
+          //   align:"center",
+          //   dataIndex: 'glf'
+          // },
+          // {
+          //   title:'总价',
+          //   align:"center",
+          //   dataIndex: 'totalPrice'
+          // },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/costModelList/costModelList/list",
+          delete: "/costModelList/costModelList/delete",
+          deleteBatch: "/costModelList/costModelList/deleteBatch",
+          exportXlsUrl: "/costModelList/costModelList/exportXlsWXFCLFDetail",
+          // exportXlsUrl: "/costModelList/costModelList/exportXls",
+          importExcelUrl: "costModelList/costModelList/importExcel",
+
+        },
+        dictOptions:{},
+        superFieldList:[],
+
+        // returnKeys:['id', 'id'], //用户选择返回字段
+        // userIds:"",
+        visibleInform: false,
+        disableSubmit: false,
+        receiver: "",
+
+        inform: {},
+
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      detailClick(text, record, dialogType, columnType, columnTitle){
+        console.log(text, record, columnType, columnTitle)
+        // 没有值不弹窗
+        if(!text){
+          return
+        }
+        this.$refs.costModelListModal.dialogType = dialogType
+        this.$refs.costModelListModal.id = record.id
+        this.$refs.costModelListModal.columnType = columnType
+        this.$refs.costModelListModal.title =  columnTitle + '明细'
+        this.$refs.costModelListModal.show()
+      },
+      getClickColumn(record, index){
+        return {
+          style: {
+            'color': '#1890ff',
+            'cursor': 'pointer',
+          },
+          on: {
+            click: (event)=> {
+              // 没有值不弹窗
+              if(!event.target.textContent){
+                return
+              }
+              // console.log(record, index, event, event.target.cellIndex)
+              // console.log(this.columns[event.target.cellIndex - 1])
+              // var clickColumn = this.columns[event.target.cellIndex - 1].dataIndex
+              console.log(event.target.cellIndex - 1)
+              // var title = this.columns[event.target.cellIndex - 1].title
+              // this.$refs.proCostDetail.taskno = record.taskno
+              // if(record.status === '1'){
+              //   // 批产参数
+              //   this.$refs.proCostDetail.pichanInfo = {
+              //     pccode: record.pccode,
+              //     proportion: record.proportion,
+              //     columnValue: clickColumn,
+              //   }
+              //   this.$refs.proCostDetail.columnValue = 'pichanTask'
+              //   this.$refs.proCostDetail.title = title + '批产明细'
+              // } else {
+              //   this.$refs.proCostDetail.columnValue = clickColumn
+              //   this.$refs.proCostDetail.title =  title + '明细'
+              // }
+              // console.log(this.$refs.proCostDetail.columnValue)
+              // this.$refs.costModelListModal.show()
+            },
+          }
+        }
+      },
+      handleInform(record){
+        console.log(record)
+        this.inform.id = record.id
+        this.visibleInform = true
+      },
+      handleOk(){
+        // this.visibleInform = false
+        console.log(this.receiver)
+        this.inform.informTo = this.receiver.toString()
+        costModelInform(this.inform).then(res => {
+          console.log(res)
+          this.visibleInform = false
+          this.loadData()
+        })
+      },
+      handleCancel(){
+        this.visibleInform = false
+
+      },
+      handleExportItem(record){
+        this.queryParam.xiangmuid = record.id
+        this.handleExportXls(record.xmName+'成本模型')
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'xmName',text:'项目名称',dictCode:''})
+        // fieldList.push({type:'string',value:'wxf',text:'外协费',dictCode:''})
+        // fieldList.push({type:'string',value:'clf',text:'材料费',dictCode:''})
+        // fieldList.push({type:'string',value:'clfType',text:'材料费类型',dictCode:''})
+        // fieldList.push({type:'string',value:'swf',text:'事务费',dictCode:''})
+        // fieldList.push({type:'string',value:'zyf',text:'专用费',dictCode:''})
+        // fieldList.push({type:'string',value:'gdzczj',text:'固定资产折旧费',dictCode:''})
+        // fieldList.push({type:'string',value:'rldlf',text:'燃料动力费',dictCode:''})
+        // fieldList.push({type:'string',value:'gzjlwf',text:'工资及劳务费',dictCode:''})
+        // fieldList.push({type:'string',value:'glf',text:'管理费',dictCode:''})
+        // fieldList.push({type:'string',value:'totalPrice',text:'总价',dictCode:''})
+        this.superFieldList = fieldList
+      },
+      // 警告
+      handleJG(record){
+        console.log(record)
+        this.$refs.costModelJgModal.id = record.id
+        this.$refs.costModelJgModal.show()
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 173 - 0
src/views/module_kzks/costModelClYushi/modules/CostModelClYushiForm.vue

@@ -0,0 +1,173 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="xmName">
+              <a-input v-model="model.xmName" placeholder="请输入项目名称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <!-- <a-col :span="24">
+            <a-form-model-item label="外协费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wxf">
+              <j-upload v-model="model.wxfurl" :returnUrl="false" :number="1" :multiple="false" text="上传"></j-upload>
+            </a-form-model-item>
+          </a-col> -->
+          <a-col :span="24">
+            <a-form-model-item label="材料费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="clf">
+              <!-- <a-input v-model="model.clf" placeholder="请输入材料费"  ></a-input> -->
+              <!-- <j-upload v-model="model.fileCL" :returnUrl="false" :number="1" :multiple="false" text="上传"></j-upload> -->
+              <j-upload v-model="model.clfurl" :returnUrl="false" :number="1" :multiple="false" text="上传"></j-upload>
+            </a-form-model-item>
+          </a-col>
+          <!-- <a-col :span="24">
+            <a-form-model-item label="材料费类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="clfType">
+              <a-input v-model="model.clfType" placeholder="请输入材料费类型"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="事务费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="swf">
+              <a-input v-model="model.swf" placeholder="请输入事务费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="专用费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="zyf">
+              <a-input v-model="model.zyf" placeholder="请输入专用费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="固定资产折旧费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gdzczj">
+              <a-input v-model="model.gdzczj" placeholder="请输入固定资产折旧费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="燃料动力费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="rldlf">
+              <a-input v-model="model.rldlf" placeholder="请输入燃料动力费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="工资及劳务费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="gzjlwf">
+              <a-input v-model="model.gzjlwf" placeholder="请输入工资及劳务费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="管理费" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="glf">
+              <a-input v-model="model.glf" placeholder="请输入管理费"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="总价" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="totalPrice">
+              <a-input v-model="model.totalPrice" placeholder="请输入总价"  ></a-input>
+            </a-form-model-item>
+          </a-col> -->
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { getModalIdList } from '@/api/kzksApi'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'CostModelListForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+          xmName: '',
+          fileWX: [],
+          fileCL: [],
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+           xmName: [
+              { required: true, message: '请输入项目名称!'},
+           ],
+        },
+        url: {
+          add: "/costModelList/costModelList/add",
+          edit: "/costModelList/costModelList/edit",
+          queryById: "/costModelList/costModelList/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.visible = true;
+        // this.edit(this.modelDefault);
+      },
+      edit (record) {
+        const data = {
+          id: record.id
+        }
+        getModalIdList(data).then((res) => {
+          console.log(res)
+          this.model = res.result
+        })
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            // console.log(111111,this.model)
+            // this.model.wxfurl = this.model.fileWX[0].filePath
+            // this.model.clfurl = this.model.fileCL[0].filePath
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 84 - 0
src/views/module_kzks/costModelClYushi/modules/CostModelClYushiModal.Style#Drawer.vue

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <cost-model-cl-yushi-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></cost-model-cl-yushi-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import CostModelClYushiForm from './CostModelClYushiForm'
+
+  export default {
+    name: '',
+    components: {
+      CostModelClYushiForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
src/views/module_kzks/costModelClYushi/modules/CostModelClYushiModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <cost-model-cl-yushi-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></cost-model-cl-yushi-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import CostModelClYushiForm from './CostModelClYushiForm'
+  export default {
+    name: '',
+    components: {
+      CostModelClYushiForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 57 - 0
src/views/module_kzks/costModelClYushi/modulesDetail/CostModelDetailModal.vue

@@ -0,0 +1,57 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    cancelText="关闭"
+    @cancel="handleCancel">
+    <!-- 合同 -->
+    <!-- <contract-detail-list v-if="columnValue === 'contractfpe'" :taskno="taskno"></contract-detail-list> -->
+    <cost-model-xmxq-cl-list v-if="dialogType === 'clf'" :id="id" :type="columnType"></cost-model-xmxq-cl-list>
+    <cost-model-xmxq-wx-list ref="wxf" v-if="dialogType === 'wxf'" :id="id" :type="columnType"></cost-model-xmxq-wx-list>
+
+    <template slot="footer">
+      <a-button @click="handleCancel">关闭</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script>
+import CostModelXmxqClList from './CostModelXmxqClList.vue';
+import CostModelXmxqWxList from './CostModelXmxqWxList.vue';
+
+  export default {
+    name: 'ProjectCostModal',
+    components: {
+      CostModelXmxqClList,
+      CostModelXmxqWxList
+    },
+    data () {
+      return {
+        dialogType: null,
+        id: null,
+        columnType: '',
+        title: '',
+        title:'',
+        width: '60%',
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      show() {
+        this.visible = true
+        // this.$refs.wxf.getList(this.id, this.columnType)
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      },
+    }
+  }
+</script>

+ 50 - 0
src/views/module_kzks/costModelClYushi/modulesDetail/CostModelJgModal.vue

@@ -0,0 +1,50 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    cancelText="关闭"
+    @cancel="handleCancel">
+
+    <cost-model-msg-list :id="id"></cost-model-msg-list>
+
+    <template slot="footer">
+      <a-button @click="handleCancel">关闭</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script>
+import CostModelMsgList from '../../costModelMsg/CostModelMsgList.vue';
+
+  export default {
+    name: 'CostModelJgModal',
+    components: {
+        CostModelMsgList
+    },
+    data () {
+      return {
+        id: null,
+        title: '警告明细',
+        width: '60%',
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      show() {
+        this.visible = true
+        // this.$refs.wxf.getList(this.id, this.columnType)
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      },
+    }
+  }
+</script>

+ 378 - 0
src/views/module_kzks/costModelClYushi/modulesDetail/CostModelXmxqClList.vue

@@ -0,0 +1,378 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <!-- <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="物料编码">
+              <a-input placeholder="请输入物料编码" v-model="queryParam.wlbm"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="规格型号">
+              <a-input placeholder="请输入规格型号" v-model="queryParam.ggxh"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="质量等级">
+                <a-input placeholder="请输入质量等级" v-model="queryParam.zlLevel"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="批次">
+                <a-input placeholder="请输入批次" v-model="queryParam.pici"></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div> -->
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <!-- <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('项目材料导入详情')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload> -->
+      <!-- 高级查询区域 -->
+      <!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div> -->
+
+    <!-- table区域-begin -->
+    <div>
+      <!-- <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div> -->
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <!-- <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span> -->
+
+      </a-table>
+    </div>
+
+    <!-- <cost-model-xmxq-cl-modal ref="modalForm" @ok="modalFormOk"></cost-model-xmxq-cl-modal> -->
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  // import CostModelXmxqClModal from './modules/CostModelXmxqClModal'
+  import { getAction } from '@/api/manage'
+
+  export default {
+    name: 'CostModelXmxqClList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      // CostModelXmxqClModal
+    },
+    props: ['id', 'type'],
+    data () {
+      return {
+        description: '项目材料导入详情管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'项目ID',
+            align:"center",
+            dataIndex: 'xiangmuId'
+          },
+          {
+            title:'项目名称',
+            align:"center",
+            dataIndex: 'xiangmuName'
+          },
+          {
+            title:'物料编码',
+            align:"center",
+            dataIndex: 'wlbm'
+          },
+          {
+            title:'规格型号',
+            align:"center",
+            dataIndex: 'ggxh'
+          },
+          {
+            title:'质量等级',
+            align:"center",
+            dataIndex: 'zlLevel'
+          },
+          {
+            title:'批次',
+            align:"center",
+            dataIndex: 'pici'
+          },
+          // {
+          //   title:'采购日期',
+          //   align:"center",
+          //   dataIndex: 'caigouTime',
+          //   customRender:function (text) {
+          //     return !text?"":(text.length>10?text.substr(0,10):text)
+          //   }
+          // },
+          {
+            title:'合同签署日期',
+            align:"center",
+            dataIndex: 'htDate'
+          },
+          {
+            title:'数量',
+            align:"center",
+            width: 60,
+            dataIndex: 'number',
+            fixed: 'right',
+          },
+          // {
+          //   title:'单价(最大值)',
+          //   align:"center",
+          //   dataIndex: 'maxDanjia'
+          // },
+          // {
+          //   title:'单价(最小值)',
+          //   align:"center",
+          //   dataIndex: 'minDanjia'
+          // },
+          // {
+          //   title:'单价(平均值)',
+          //   align:"center",
+          //   dataIndex: 'aveDanjia'
+          // },
+          // {
+          //   title:'单价(近期值)',
+          //   align:"center",
+          //   dataIndex: 'recentDanjia'
+          // },
+          // {
+          //   title:'价格(最大值)',
+          //   align:"center",
+          //   dataIndex: 'maxPrice'
+          // },
+          // {
+          //   title:'价格(最小值)',
+          //   align:"center",
+          //   dataIndex: 'minPrice'
+          // },
+          // {
+          //   title:'价格(平均值)',
+          //   align:"center",
+          //   dataIndex: 'avePrice'
+          // },
+          // {
+          //   title:'价格(近期值)',
+          //   align:"center",
+          //   dataIndex: 'recentPrice'
+          // },
+          // {
+          //   title:'单价',
+          //   align:"center",
+          //   dataIndex: 'danjia'
+          // },
+          // {
+          //   title:'数量',
+          //   align:"center",
+          //   dataIndex: 'number'
+          // },
+          // {
+          //   title:'价格(单价*数量)',
+          //   align:"center",
+          //   dataIndex: 'price'
+          // },
+          // {
+          //   title:'材料费类型',
+          //   align:"center",
+          //   dataIndex: 'clfType'
+          // },
+          // {
+          //   title: '操作',
+          //   dataIndex: 'action',
+          //   align:"center",
+          //   fixed:"right",
+          //   width:147,
+          //   scopedSlots: { customRender: 'action' }
+          // }
+        ],
+        url: {
+          list: "/costModelXmxqCl/costModelXmxqCl/list",
+          delete: "/costModelXmxqCl/costModelXmxqCl/delete",
+          deleteBatch: "/costModelXmxqCl/costModelXmxqCl/deleteBatch",
+          exportXlsUrl: "/costModelXmxqCl/costModelXmxqCl/exportXls",
+          importExcelUrl: "costModelXmxqCl/costModelXmxqCl/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+      this.setColumn()
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      // 获取页面列表
+      loadData(arg) {
+        this.queryParam.xiangmuId = this.id
+        if(!this.url.list){
+          this.$message.error("请设置url.list属性!")
+          return
+        }
+        //加载数据 若传入参数1则加载第一页的内容
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        var params = this.getQueryParams();//查询条件
+        this.loading = true;
+        getAction(this.url.list, params).then((res) => {
+          if (res.success) {
+            //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+            this.dataSource = res.result.records||res.result;
+
+            if(res.result.total)
+            {
+              this.ipagination.total = res.result.total;
+            }else{
+              this.ipagination.total = 0;
+            }
+            //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+          }else{
+            this.$message.warning(res.message)
+          }
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      setColumn(){
+        if (this.type == 'max') {
+          this.columns.push(
+            { title:'单价(最大值)', align:"center", dataIndex: 'maxDanjia', fixed: 'right', width: 120 },
+            { title:'价格(最大值)', align:"center", dataIndex: 'maxPrice', fixed: 'right', width: 120 }
+          )
+        }
+        if (this.type == 'min') {
+          this.columns.push(
+            { title:'单价(最小值)', align:"center", dataIndex: 'minDanjia', fixed: 'right', width: 120 },
+            { title:'价格(最小值)', align:"center", dataIndex: 'minPrice', fixed: 'right', width: 120 }
+          )
+        }
+        if (this.type == 'ave') {
+          this.columns.push(
+            { title:'单价(平均值)', align:"center", dataIndex: 'aveDanjia', fixed: 'right', width: 120 },
+            { title:'价格(平均值)', align:"center", dataIndex: 'avePrice', fixed: 'right', width: 120 }
+          )
+        }
+        if (this.type == 'recent') {
+          this.columns.push(
+            { title:'单价(近期值)', align:"center", dataIndex: 'recentDanjia', fixed: 'right', width: 120 },
+            { title:'价格(近期值)', align:"center", dataIndex: 'recentPrice', fixed: 'right', width: 120 }
+          )
+        }
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'xiangmuId',text:'项目ID',dictCode:''})
+        fieldList.push({type:'string',value:'xiangmuName',text:'项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'wlbm',text:'物料编码',dictCode:''})
+        fieldList.push({type:'string',value:'ggxh',text:'规格型号',dictCode:''})
+        fieldList.push({type:'string',value:'zlLevel',text:'质量等级',dictCode:''})
+        fieldList.push({type:'string',value:'pici',text:'批次',dictCode:''})
+        fieldList.push({type:'date',value:'caigouTime',text:'采购日期'})
+        fieldList.push({type:'string',value:'danjia',text:'单价',dictCode:''})
+        fieldList.push({type:'string',value:'number',text:'数量',dictCode:''})
+        fieldList.push({type:'string',value:'price',text:'价格(单价*数量)',dictCode:''})
+        fieldList.push({type:'string',value:'clfType',text:'材料费类型',dictCode:''})
+        this.superFieldList = fieldList
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 337 - 0
src/views/module_kzks/costModelClYushi/modulesDetail/CostModelXmxqWxList.vue

@@ -0,0 +1,337 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <!-- <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="外协项目">
+              <a-input placeholder="请输入外协项目" v-model="queryParam.wxProject"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="外协单位">
+              <a-input placeholder="请输入外协单位" v-model="queryParam.wxCompany"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="计量单位">
+                <a-input placeholder="请输入计量单位" v-model="queryParam.unit"></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div> -->
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <!-- <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('项目外协导入详情')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload> -->
+      <!-- 高级查询区域 -->
+      <!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div> -->
+
+    <!-- table区域-begin -->
+    <div>
+      <!-- <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div> -->
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <!-- <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span> -->
+
+      </a-table>
+    </div>
+
+    <!-- <cost-model-xmxq-wx-modal ref="modalForm" @ok="modalFormOk"></cost-model-xmxq-wx-modal> -->
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import { getAction } from '@/api/manage'
+  // import CostModelXmxqWxModal from './modules/CostModelXmxqWxModal'
+
+  export default {
+    name: 'CostModelXmxqWxList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      // CostModelXmxqWxModal
+    },
+    props: ['id', 'type'],
+    data () {
+      return {
+        description: '项目外协导入详情管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'项目ID',
+            align:"center",
+            dataIndex: 'xiangmuId'
+          },
+          {
+            title:'项目名称',
+            align:"center",
+            dataIndex: 'xiangmuName'
+          },
+          {
+            title:'外协项目',
+            align:"center",
+            dataIndex: 'wxProject'
+          },
+          {
+            title:'外协单位',
+            align:"center",
+            dataIndex: 'wxCompany'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'项目描述',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title:'数量',
+            align:"center",
+            width: 60,
+            dataIndex: 'number',
+            fixed: 'right',
+          },
+          // {
+          //   title:'价格(单价*数量)',
+          //   align:"center",
+          //   dataIndex: 'price'
+          // },
+          // {
+          //   title:'单价(最大值)',
+          //   align:"center",
+          //   dataIndex: 'maxDanjia'
+          // },
+          // {
+          //   title:'单价(最小值)',
+          //   align:"center",
+          //   dataIndex: 'minDanjia'
+          // },
+          // {
+          //   title:'单价(平均值)',
+          //   align:"center",
+          //   dataIndex: 'aveDanjia'
+          // },
+          // {
+          //   title:'单价(近期值)',
+          //   align:"center",
+          //   dataIndex: 'recentDanjia'
+          // },
+          // {
+          //   title:'价格(最大值)',
+          //   align:"center",
+          //   dataIndex: 'maxPrice'
+          // },
+          // {
+          //   title:'价格(最小值)',
+          //   align:"center",
+          //   dataIndex: 'minPrice'
+          // },
+          // {
+          //   title:'价格(平均值)',
+          //   align:"center",
+          //   dataIndex: 'avePrice'
+          // },
+          // {
+          //   title:'价格(近期值)',
+          //   align:"center",
+          //   dataIndex: 'recentPrice'
+          // },
+          // {
+          //   title: '操作',
+          //   dataIndex: 'action',
+          //   align:"center",
+          //   fixed:"right",
+          //   width:147,
+          //   scopedSlots: { customRender: 'action' }
+          // }
+        ],
+        url: {
+          list: "/costModelXmxqWx/costModelXmxqWx/list",
+          delete: "/costModelXmxqWx/costModelXmxqWx/delete",
+          deleteBatch: "/costModelXmxqWx/costModelXmxqWx/deleteBatch",
+          exportXlsUrl: "/costModelXmxqWx/costModelXmxqWx/exportXls",
+          importExcelUrl: "costModelXmxqWx/costModelXmxqWx/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+      this.getSuperFieldList();
+      this.setColumn()
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      // 获取页面列表
+      loadData(arg) {
+        this.queryParam.xiangmuId = this.id
+        if(!this.url.list){
+          this.$message.error("请设置url.list属性!")
+          return
+        }
+        //加载数据 若传入参数1则加载第一页的内容
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        var params = this.getQueryParams();//查询条件
+        this.loading = true;
+        getAction(this.url.list, params).then((res) => {
+          if (res.success) {
+            //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+            this.dataSource = res.result.records||res.result;
+
+            if(res.result.total)
+            {
+              this.ipagination.total = res.result.total;
+            }else{
+              this.ipagination.total = 0;
+            }
+            //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+          }else{
+            this.$message.warning(res.message)
+          }
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      setColumn(){
+        if (this.type == 'max') {
+          this.columns.push(
+            { title:'单价(最大值)', align:"center", dataIndex: 'maxDanjia', fixed: 'right', width: 120 },
+            { title:'价格(最大值)', align:"center", dataIndex: 'maxPrice', fixed: 'right', width: 120 }
+          )
+        }
+        if (this.type == 'min') {
+          this.columns.push(
+            { title:'单价(最小值)', align:"center", dataIndex: 'minDanjia', fixed: 'right', width: 120 },
+            { title:'价格(最小值)', align:"center", dataIndex: 'minPrice', fixed: 'right', width: 120 }
+          )
+        }
+        if (this.type == 'ave') {
+          this.columns.push(
+            { title:'单价(平均值)', align:"center", dataIndex: 'aveDanjia', fixed: 'right', width: 120 },
+            { title:'价格(平均值)', align:"center", dataIndex: 'avePrice', fixed: 'right', width: 120 }
+          )
+        }
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'xiangmuId',text:'项目ID',dictCode:''})
+        fieldList.push({type:'string',value:'xiangmuName',text:'项目名称',dictCode:''})
+        fieldList.push({type:'string',value:'wxProject',text:'外协项目',dictCode:''})
+        fieldList.push({type:'string',value:'wxCompany',text:'外协单位',dictCode:''})
+        fieldList.push({type:'string',value:'danjia',text:'单价',dictCode:''})
+        fieldList.push({type:'string',value:'unit',text:'计量单位',dictCode:''})
+        fieldList.push({type:'string',value:'number',text:'数量',dictCode:''})
+        fieldList.push({type:'string',value:'price',text:'价格(单价*数量)',dictCode:''})
+        fieldList.push({type:'string',value:'remark',text:'描述',dictCode:''})
+        this.superFieldList = fieldList
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 201 - 0
src/views/module_kzks/costModelProductPrice/CostModelProductPriceList.vue

@@ -0,0 +1,201 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('kzks_cost_model_product_price')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+
+    <cost-model-product-price-modal ref="modalForm" @ok="modalFormOk"></cost-model-product-price-modal>
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CostModelProductPriceModal from './modules/CostModelProductPriceModal'
+
+  export default {
+    name: 'CostModelProductPriceList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      CostModelProductPriceModal
+    },
+    data () {
+      return {
+        description: 'kzks_cost_model_product_price管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'产品名称',
+            align:"center",
+            dataIndex: 'cpname'
+          },
+          {
+            title:'阶段',
+            align:"center",
+            dataIndex: 'yzjdname'
+          },
+          {
+            title:'合同额/来自收款合同的合同分配额 ',
+            align:"center",
+            dataIndex: 'contractfpe'
+          },
+          {
+            title:'研制数量/来自科研任务',
+            align:"center",
+            dataIndex: 'yzsl'
+          },
+          {
+            title:'单台收入/(合同额or预估价)/研制数量',
+            align:"center",
+            dataIndex: 'oneIncome'
+          },
+          {
+            title:'提出单位简称',
+            align:"center",
+            dataIndex: 'brief'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/costModelProductPrice/costModelProductPrice/list",
+          delete: "/costModelProductPrice/costModelProductPrice/delete",
+          deleteBatch: "/costModelProductPrice/costModelProductPrice/deleteBatch",
+          exportXlsUrl: "/costModelProductPrice/costModelProductPrice/exportXls",
+          importExcelUrl: "costModelProductPrice/costModelProductPrice/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'cpname',text:'产品名称'})
+        fieldList.push({type:'string',value:'yzjdname',text:'阶段'})
+        fieldList.push({type:'number',value:'contractfpe',text:'合同额/来自收款合同的合同分配额 '})
+        fieldList.push({type:'int',value:'yzsl',text:'研制数量/来自科研任务'})
+        fieldList.push({type:'number',value:'oneIncome',text:'单台收入/(合同额or预估价)/研制数量'})
+        fieldList.push({type:'string',value:'brief',text:'提出单位简称'})
+        this.superFieldList = fieldList
+      }
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>

+ 129 - 0
src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceForm.vue

@@ -0,0 +1,129 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="产品名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="cpname">
+              <a-input v-model="model.cpname" placeholder="请输入产品名称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="阶段" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="yzjdname">
+              <a-input v-model="model.yzjdname" placeholder="请输入阶段"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="合同额/来自收款合同的合同分配额 " :labelCol="labelCol" :wrapperCol="wrapperCol" prop="contractfpe">
+              <a-input-number v-model="model.contractfpe" placeholder="请输入合同额/来自收款合同的合同分配额 " style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="研制数量/来自科研任务" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="yzsl">
+              <a-input-number v-model="model.yzsl" placeholder="请输入研制数量/来自科研任务" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="单台收入/(合同额or预估价)/研制数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="oneIncome">
+              <a-input-number v-model="model.oneIncome" placeholder="请输入单台收入/(合同额or预估价)/研制数量" style="width: 100%" />
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="提出单位简称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="brief">
+              <a-input v-model="model.brief" placeholder="请输入提出单位简称"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'CostModelProductPriceForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+        },
+        url: {
+          add: "/costModelProductPrice/costModelProductPrice/add",
+          edit: "/costModelProductPrice/costModelProductPrice/edit",
+          queryById: "/costModelProductPrice/costModelProductPrice/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 84 - 0
src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceModal.Style#Drawer.vue

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <cost-model-product-price-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></cost-model-product-price-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import CostModelProductPriceForm from './CostModelProductPriceForm'
+
+  export default {
+    name: 'CostModelProductPriceModal',
+    components: {
+      CostModelProductPriceForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
src/views/module_kzks/costModelProductPrice/modules/CostModelProductPriceModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <cost-model-product-price-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></cost-model-product-price-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import CostModelProductPriceForm from './CostModelProductPriceForm'
+  export default {
+    name: 'CostModelProductPriceModal',
+    components: {
+      CostModelProductPriceForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 394 - 0
src/views/module_kzks/costModelWxPriceSddr/CostModelWxPriceList.vue

@@ -0,0 +1,394 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="外协项目">
+              <a-input placeholder="请输入外协项目" v-model="queryParam.wxProject"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="外协单位">
+              <a-input placeholder="请输入外协单位" v-model="queryParam.wxCompany"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="计量单位">
+              <a-input placeholder="请输入计量单位" v-model="queryParam.unit"></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+            <a-col :xl="6" :lg="7" :md="8" :sm="24">
+              <a-form-item label="计量单位">
+                <a-input placeholder="请输入计量单位" v-model="queryParam.unit"></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <!-- <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a> -->
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('外协价格库')">导出</a-button>
+      <a-upload v-if="isalarm === 0" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-tooltip v-if="isalarm === 1" placement="bottom">
+        <template slot="title">
+          <span>请先处理重复项</span>
+        </template>
+        <a-button type="primary" icon="import" disabled>导入</a-button>
+      </a-tooltip>
+      <!-- 高级查询区域 -->
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+
+        <span style="float:right;">
+          <a @click="loadData()"><a-icon type="sync" />刷新</a>
+          <a-divider type="vertical" v-if="isalarm === 1" />
+          
+          <a v-if="isalarm === 1" style="color: #ffa11e;" @click="visibleRepeat = true"><a-icon type="exclamation-circle" />有重复项!请处理!</a>
+
+        </span>
+
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{x:true}"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        class="j-table-force-nowrap"
+        @change="handleTableChange">
+
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text,record">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span>
+          <img v-else :src="getImgView(text)" :preview="record.id" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/>
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)">
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+          <!-- <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown> -->
+        </span>
+
+      </a-table>
+    </div>
+
+    <cost-model-wx-price-modal ref="modalForm" @ok="modalFormOk"></cost-model-wx-price-modal>
+
+    <j-modal
+      title="处理重复项"
+      :width="800"
+      :visible="visibleRepeat"
+      switchFullscreen
+      @ok="handleOk"
+      @cancel="handleCancel"
+      cancelText="关闭"
+      class="repeat-model">
+      <!-- :okButtonProps="{ class:{'jee-hidden': disableSubmit} }" -->
+      <cost-model-wx-repeat-list ref="wxRepeatRef" @ok="handleSure"></cost-model-wx-repeat-list>
+    </j-modal>
+
+  </a-card>
+</template>
+
+<script>
+
+  import '@/assets/less/TableExpand.less'
+  import { mixinDevice } from '@/utils/mixin'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+  import CostModelWxPriceModal from './modules/CostModelWxPriceModal'
+import CostModelWxRepeatList from '../costModelWxRepeat/CostModelWxRepeatList.vue'
+import { getAction } from '@/api/manage'
+
+  export default {
+    name: 'CostModelWxPriceList',
+    mixins:[JeecgListMixin, mixinDevice],
+    components: {
+      CostModelWxPriceModal,
+      CostModelWxRepeatList
+    },
+    data () {
+      return {
+        description: '外协价格库管理页面',
+        // 表头
+        columns: [
+          {
+            title: '序号',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },
+          {
+            title:'外协项目',
+            align:"center",
+            dataIndex: 'wxProject'
+          },
+          {
+            title:'外协单位',
+            align:"center",
+            dataIndex: 'wxCompany'
+          },
+          // {
+          //   title:'单价',
+          //   align:"center",
+          //   dataIndex: 'danjia'
+          // },
+          {
+            title:'单价(最大值)',
+            align:"center",
+            dataIndex: 'maxPrice'
+          },
+          {
+            title:'单价(最小值)',
+            align:"center",
+            dataIndex: 'minPrice'
+          },
+          {
+            title:'单价(平均值)',
+            align:"center",
+            dataIndex: 'avePrice'
+          },
+          {
+            title:'计量单位',
+            align:"center",
+            dataIndex: 'unit'
+          },
+          {
+            title:'项目描述',
+            align:"center",
+            dataIndex: 'remark'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            fixed:"right",
+            width:147,
+            scopedSlots: { customRender: 'action' }
+          }
+        ],
+        url: {
+          list: "/costModelWxPrice/costModelWxPrice/list",
+          delete: "/costModelWxPrice/costModelWxPrice/delete",
+          deleteBatch: "/costModelWxPrice/costModelWxPrice/deleteBatch",
+          exportXlsUrl: "/costModelWxPrice/costModelWxPrice/exportXls",
+          importExcelUrl: "costModelWxPrice/costModelWxPrice/importExcel",
+          
+        },
+        dictOptions:{},
+        superFieldList:[],
+
+        // 处理重复项
+        visibleRepeat: false,
+        isalarm: 0
+      }
+    },
+    created() {
+    this.getSuperFieldList();
+    },
+    computed: {
+      importExcelUrl: function(){
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      },
+    },
+    methods: {
+      loadData(arg) {
+        if(!this.url.list){
+          this.$message.error("请设置url.list属性!")
+          return
+        }
+        //加载数据 若传入参数1则加载第一页的内容
+        if (arg === 1) {
+          this.ipagination.current = 1;
+        }
+        var params = this.getQueryParams();//查询条件
+        this.loading = true;
+        getAction(this.url.list, params).then((res) => {
+          if (res.success) {
+            //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+            this.dataSource = res.result.content.records||res.result.content;
+            this.isalarm = res.result.isalarm
+            if(res.result.total)
+            {
+              this.ipagination.total = res.result.total;
+            }else{
+              this.ipagination.total = 0;
+            }
+            //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+          }else{
+            this.$message.warning(res.message)
+          }
+        }).finally(() => {
+          this.loading = false
+        })
+      },
+      /* 导入 */
+      handleImportExcel(info){
+        this.loading = true;
+        if (info.file.status !== 'uploading') {
+          console.log(info.file, info.fileList);
+        }
+        if (info.file.status === 'done') {
+          this.loading = false;
+          console.log(info)
+          if (info.file.response.success) {
+            // this.$message.success(`${info.file.name} 文件上传成功`);
+            if (info.file.response.code === 201) {
+              let { message, result: { msg, fileUrl, fileName } } = info.file.response
+              let href = window._CONFIG['domianURL'] + fileUrl
+              this.$warning({
+                title: message,
+                content: (<div>
+                    <span>{msg}</span><br/>
+                    <span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
+                  </div>
+                )
+              })
+            } else {
+              this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
+            }
+            this.loadData()
+          } else if (info.file.response.code === 111){
+            // 数据有半重复的(外协项目、外协单位、计量单位相同,但价格不同时)
+            this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
+            this.loadData()
+          } else {
+            this.$message.error(`${info.file.name} ${info.file.response.message}.`);
+          }
+        } else if (info.file.status === 'error') {
+          this.loading = false;
+          if (info.file.response.status === 500) {
+            let data = info.file.response
+            const token = Vue.ls.get(ACCESS_TOKEN)
+            if (token && data.message.includes("Token失效")) {
+              this.$error({
+                title: '登录已过期',
+                content: '很抱歉,登录已过期,请重新登录',
+                okText: '重新登录',
+                mask: false,
+                onOk: () => {
+                  store.dispatch('Logout').then(() => {
+                    Vue.ls.remove(ACCESS_TOKEN)
+                    window.location.reload();
+                  })
+                }
+              })
+            }
+          } else {
+            this.$message.error(`文件上传失败: ${info.file.msg} `);
+          }
+        }
+      },
+      initDictConfig(){
+      },
+      getSuperFieldList(){
+        let fieldList=[];
+        fieldList.push({type:'string',value:'wxProject',text:'外协项目',dictCode:''})
+        fieldList.push({type:'string',value:'wxCompany',text:'外协单位',dictCode:''})
+        fieldList.push({type:'string',value:'danjia',text:'单价',dictCode:''})
+        fieldList.push({type:'string',value:'unit',text:'计量单位',dictCode:''})
+        fieldList.push({type:'string',value:'remark',text:'备注',dictCode:''})
+        this.superFieldList = fieldList
+      },
+      handleOk () {
+        if (this.$refs.wxRepeatRef.selectedRowKeys.length <= 0) {
+          this.$message.warning('请选择一条记录!');
+          return;
+        } else {
+          this.$refs.wxRepeatRef.handleRepeat();
+        }
+      },
+      // 实现异步关闭页面并刷新页面,不这样写会有同步页面不刷新的问题
+      handleSure(){
+        this.loadData()
+        this.close()
+      },
+      handleCancel () {
+        this.close()
+      },
+      close () {
+        this.$emit('close');
+        this.visibleRepeat = false;
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less';
+</style>
+<style lang="less" scoped>
+.repeat-model{
+  /deep/ .ant-modal-body{
+    padding: 0;
+  }
+}
+</style>

+ 153 - 0
src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceForm.vue

@@ -0,0 +1,153 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item label="外协项目" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wxProject">
+              <a-input v-model="model.wxProject" placeholder="请输入外协项目"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="外协单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="wxCompany">
+              <a-input v-model="model.wxCompany" placeholder="请输入外协单位"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <!-- <a-col :span="24">
+            <a-form-model-item label="单价" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="danjia">
+              <a-input-number v-model="model.danjia" :min="0"  placeholder="请输入单价" style="width: 100%;"/>
+            </a-form-model-item>
+          </a-col> -->
+          <a-col :span="24">
+            <a-form-model-item label="单价(最大值)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="maxPrice">
+              <a-input-number v-model="model.maxPrice" :min="0"  placeholder="请输入单价(最大值)" style="width: 100%;"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="单价(最小值)" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="minPrice">
+              <a-input-number v-model="model.minPrice" :min="0"  placeholder="请输入单价(最小值)" style="width: 100%;"/>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="计量单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="unit">
+              <a-input v-model="model.unit" placeholder="请输入计量单位"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="24">
+            <a-form-model-item label="项目描述" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
+              <a-input v-model="model.remark" placeholder="请输入项目描述"  ></a-input>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+      </a-form-model>
+    </j-form-container>
+  </a-spin>
+</template>
+
+<script>
+
+  import { httpAction, getAction } from '@/api/manage'
+  import { validateDuplicateValue } from '@/utils/util'
+
+  export default {
+    name: 'CostModelWxPriceForm',
+    components: {
+    },
+    props: {
+      //表单禁用
+      disabled: {
+        type: Boolean,
+        default: false,
+        required: false
+      }
+    },
+    data () {
+      return {
+        model:{
+         },
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+        confirmLoading: false,
+        validatorRules: {
+           wxProject: [
+              { required: true, message: '请输入外协项目!'},
+           ],
+           wxCompany: [
+              { required: true, message: '请输入外协单位!'},
+           ],
+           maxPrice: [
+              { required: true, message: '请输入单价(最大值)!'},
+           ],
+           minPrice: [
+              { required: true, message: '请输入单价(最小值)!'},
+           ],
+           danjia: [
+              { required: true, message: '请输入单价!'},
+              { pattern: /^(([1-9][0-9]*)|([0]\.\d{0,2}|[1-9][0-9]*\.\d{0,2}))$/, message: '请输入正确的金额!'},
+           ],
+           unit: [
+              { required: true, message: '请输入计量单位!'},
+           ],
+        },
+        url: {
+          add: "/costModelWxPrice/costModelWxPrice/add",
+          edit: "/costModelWxPrice/costModelWxPrice/edit",
+          queryById: "/costModelWxPrice/costModelWxPrice/queryById"
+        }
+      }
+    },
+    computed: {
+      formDisabled(){
+        return this.disabled
+      },
+    },
+    created () {
+       //备份model原始值
+      this.modelDefault = JSON.parse(JSON.stringify(this.model));
+    },
+    methods: {
+      add () {
+        this.edit(this.modelDefault);
+      },
+      edit (record) {
+        this.model = Object.assign({}, record);
+        this.visible = true;
+      },
+      submitForm () {
+        const that = this;
+        // 触发表单验证
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            httpAction(httpurl,this.model,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+            })
+          }
+         
+        })
+      },
+    }
+  }
+</script>

+ 84 - 0
src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceModal.Style#Drawer.vue

@@ -0,0 +1,84 @@
+<template>
+  <a-drawer
+    :title="title"
+    :width="width"
+    placement="right"
+    :closable="false"
+    @close="close"
+    destroyOnClose
+    :visible="visible">
+    <cost-model-wx-price-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit" normal></cost-model-wx-price-form>
+    <div class="drawer-footer">
+      <a-button @click="handleCancel" style="margin-bottom: 0;">关闭</a-button>
+      <a-button v-if="!disableSubmit"  @click="handleOk" type="primary" style="margin-bottom: 0;">提交</a-button>
+    </div>
+  </a-drawer>
+</template>
+
+<script>
+
+  import CostModelWxPriceForm from './CostModelWxPriceForm'
+
+  export default {
+    name: 'CostModelWxPriceModal',
+    components: {
+      CostModelWxPriceForm
+    },
+    data () {
+      return {
+        title:"操作",
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        });
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+  .drawer-footer{
+    position: absolute;
+    bottom: -8px;
+    width: 100%;
+    border-top: 1px solid #e8e8e8;
+    padding: 10px 16px;
+    text-align: right;
+    left: 0;
+    background: #fff;
+    border-radius: 0 0 2px 2px;
+  }
+</style>

+ 60 - 0
src/views/module_kzks/costModelWxPriceSddr/modules/CostModelWxPriceModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <cost-model-wx-price-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></cost-model-wx-price-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import CostModelWxPriceForm from './CostModelWxPriceForm'
+  export default {
+    name: 'CostModelWxPriceModal',
+    components: {
+      CostModelWxPriceForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 56 - 3
src/views/module_kzks/kpiImportList/KpiImportList.vue

@@ -34,9 +34,15 @@
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
       <a-button type="primary" icon="download" @click="handleExportXls('年指标导入')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+      <a-upload v-if="isalarm === 0" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
         <a-button type="primary" icon="import">导入</a-button>
       </a-upload>
+      <a-tooltip v-if="isalarm === 1" placement="bottom">
+        <template slot="title">
+          <span>请先处理重复项</span>
+        </template>
+        <a-button type="primary" icon="import" disabled>导入</a-button>
+      </a-tooltip>
       <!-- 高级查询区域 -->
       <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
       <a-dropdown v-if="selectedRowKeys.length > 0">
@@ -52,6 +58,14 @@
       <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
         <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
         <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+
+        <span style="float:right;">
+          <a @click="loadData()"><a-icon type="sync" />刷新</a>
+          <a-divider type="vertical" v-if="isalarm === 1" />
+          
+          <a v-if="isalarm === 1" style="color: #ffa11e;" @click="visibleRepeat = true"><a-icon type="exclamation-circle" />有重复项!请处理!</a>
+
+        </span>
       </div>
 
       <a-table
@@ -153,12 +167,18 @@
           {
             title:'指标金额',
             align:"center",
-            dataIndex: 'kpi'
+            dataIndex: 'kpi',
+            customRender: (text, record) => {
+              return (Number(text)/10000).toFixed(2)
+            },
           },
           {
             title:'平均每月',
             align:"center",
-            dataIndex: 'kpiMonth'
+            dataIndex: 'kpiMonth',
+            customRender: (text, record) => {
+              return (Number(text)/10000).toFixed(2)
+            },
           },
           {
             title:'指标部门',
@@ -184,6 +204,9 @@
         },
         dictOptions:{},
         superFieldList:[],
+        // 处理重复项
+        visibleRepeat: false,
+        isalarm: 0
       }
     },
     created() {
@@ -195,6 +218,36 @@
       },
     },
     methods: {
+      // loadData(arg) {
+      //   if(!this.url.list){
+      //     this.$message.error("请设置url.list属性!")
+      //     return
+      //   }
+      //   //加载数据 若传入参数1则加载第一页的内容
+      //   if (arg === 1) {
+      //     this.ipagination.current = 1;
+      //   }
+      //   var params = this.getQueryParams();//查询条件
+      //   this.loading = true;
+      //   getAction(this.url.list, params).then((res) => {
+      //     if (res.success) {
+      //       //update-begin---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+      //       this.dataSource = res.result.content.records||res.result.content;
+      //       this.isalarm = res.result.isalarm
+      //       if(res.result.total)
+      //       {
+      //         this.ipagination.total = res.result.total;
+      //       }else{
+      //         this.ipagination.total = 0;
+      //       }
+      //       //update-end---author:zhangyafei    Date:20201118  for:适配不分页的数据列表------------
+      //     }else{
+      //       this.$message.warning(res.message)
+      //     }
+      //   }).finally(() => {
+      //     this.loading = false
+      //   })
+      // },
       initDictConfig(){
       },
       getSuperFieldList(){

+ 264 - 262
src/views/module_kzks/projectContrastList/allList.vue

@@ -7,7 +7,7 @@
       <a-button :type="selectedMode==='single'?'primary':'link'" @click="selectedMode = 'single'">单选</a-button>
       <a-button :type="selectedMode==='multiple'?'primary':'link'" @click="selectedMode = 'multiple'">多选</a-button>
     </div> -->
-    <lineBarChart :xAxisData="xAxisData" :seriesData="seriesData" :selectedMode="selectedMode" style="height: 360px;"></lineBarChart>
+    <lineBarChart :xAxisData="xAxisData" :seriesData="seriesData" :selectedMode="selectedMode" style="height: 360px;margin-top: 22px;"></lineBarChart>
   </div>
   
 </template>
@@ -15,252 +15,241 @@
 import lineBarChart from './components/lineBarChart.vue'
 
 const columns = [
-          {
-            title:'任务号',
-            fixed:"left",
-            align:"center",
-            width: 140,
-            dataIndex: 'taskno',
-          },
-          {
-            title:'任务名称',
-            align:"center",
-            fixed:"left",
-            width: 120,
-            dataIndex: 'taskname'
-          },
-          {
-            title:'型号',
-            align:"center",
-            dataIndex: 'xhname'
-          },
-          {
-            title:'计划完成时间',
-            align:"center",
-            dataIndex: 'jhwcsj',
-          },
-          {
-            title:'阶段',
-            align:"center",
-            dataIndex: 'yzjdname'
-          },
-          {
-            title:'项目进度',
-            align:"center",
-            dataIndex: 'processpercent'
-          },
-          {
-            title:'成本进度',
-            align:"center",
-            dataIndex: 'costPercent'
-          },
-          {
-            title:'研制数量',
-            align:"center",
-            dataIndex: 'yzsl',
-            isEcharts: true,
-          },
-          {
-            title:'单台收入',
-            align:"center",
-            dataIndex: 'oneIncome',
-            isEcharts: true,
-          },
-          {
-            title:'单台成本',
-            align:"center",
-            dataIndex: 'oneCost',
-            isEcharts: true,
-          },
-          {
-            title:'单台利润',
-            align:"center",
-            dataIndex: 'oneProfit',
-            isEcharts: true,
-          },
-          {
-            title:'利润额',
-            align:"center",
-            dataIndex: 'lre',
-            isEcharts: true,
-          },
-          {
-            title:'利润率',
-            align:"center",
-            dataIndex: 'lrl',
-            isEcharts: true,
-          },
-          {
-            title:'预估价',
-            align:"center",
-            dataIndex: 'estimationcoat',
-            isEcharts: true,
-          },
-          {
-            title:'合同额',
-            align:"center",
-            dataIndex: 'contractfpe',
-            isEcharts: true,
-          },
-          {
-            title:'已收款',
-            align:"center",
-            dataIndex: 'taskmoney',
-            isEcharts: true,
-          },
-          {
-            title:'总成本',
-            align:"center",
-            dataIndex: 'zcb',
-            isEcharts: true,
-          },
-          {
-            title:'材料费',
-            align:"center",
-            dataIndex: 'clf',
-            isEcharts: true,
-          },
-          {
-            title:'专用费',
-            align:"center",
-            dataIndex: 'zyf',
-            isEcharts: true,
-          },
-          {
-            title:'事务费',
-            align:"center",
-            dataIndex: 'swf',
-            isEcharts: true,
-          },
-          {
-            title:'外协费',
-            align:"center",
-            dataIndex: 'wxf',
-            isEcharts: true,
-          },
-          {
-            title:'燃料动力费',
-            align:"center",
-            dataIndex: 'rldlf',
-            isEcharts: true,
-          },
-          {
-            title:'固定资产折旧',
-            align:"center",
-            dataIndex: 'gdzczj',
-            isEcharts: true,
-          },
-          {
-            title:'工资及劳务费',
-            align:"center",
-            dataIndex: 'gzjlwf',
-            isEcharts: true,
-          },
-          {
-            title:'管理费',
-            align:"center",
-            dataIndex: 'glf',
-            isEcharts: true,
-          },
-          {
-            title:'装机成本',
-            align:"center",
-            dataIndex: 'zjcb',
-            isEcharts: true,
-          },
-          {
-            title:'内部试验',
-            align:"center",
-            dataIndex: 'lbsy'
-          },
-          {
-            title:'工时(h)',
-            align:"center",
-            dataIndex: 'workhour',
-            isEcharts: true,
-          },
-          {
-            title:'责任部门',
-            align:"center",
-            dataIndex: 'zrbm'
-          },
-          {
-            title:'下达部门',
-            align:"center",
-            dataIndex: 'jycs'
-          },
-          {
-            title:'横向纵向',
-            align:"center",
-            dataIndex: 'hxzxname'
-          },
-          {
-            title:'任务类型',
-            align:"center",
-            dataIndex: 'tasktype'
-          },
-          {
-            title:'审计审价',
-            align:"center",
-            dataIndex: 'auditprice'
-          },
-          {
-            title:'任务状态',
-            align:"center",
-            dataIndex: 'iflag'
-          },
-          {
-            title:'提出单位简称',
-            align:"center",
-            dataIndex: 'brief'
-          },
-          {
-            title:'父级任务',
-            align:"center",
-            dataIndex: 'reftaskno'
-          },
-          {
-            title:'批产任务号',
-            align:"center",
-            dataIndex: 'pccode'
-          },
-          {
-            title:'备产任务号',
-            align:"center",
-            dataIndex: 'bccode'
-          },
-          {
-            title:'备料任务号',
-            align:"center",
-            dataIndex: 'blcode'
-          },
-          {
-            title:'业务员',
-            align:"center",
-            dataIndex: 'businessman'
-          },
-          {
-            title:'设计工时',
-            align:"center",
-            dataIndex: 'sjgs',
-            isEcharts: true,
-          },
-          {
-            title:'生产工时',
-            align:"center",
-            dataIndex: 'scgs',
-            isEcharts: true,
-          },
-        ];
-
-
-
+  {
+    title:'任务号',
+    fixed:"left",
+    align:"center",
+    width: 140,
+    dataIndex: 'taskno',
+  },
+  {
+    title:'任务名称',
+    align:"center",
+    fixed:"left",
+    width: 120,
+    dataIndex: 'taskname'
+  },
+  {
+    title:'型号',
+    align:"center",
+    dataIndex: 'xhname'
+  },
+  {
+    title:'计划完成时间',
+    align:"center",
+    dataIndex: 'jhwcsj',
+  },
+  {
+    title:'阶段',
+    align:"center",
+    dataIndex: 'yzjdname'
+  },
+  {
+    title:'项目进度',
+    align:"center",
+    dataIndex: 'processpercent'
+  },
+  {
+    title:'成本进度',
+    align:"center",
+    dataIndex: 'costPercent'
+  },
+  {
+    title:'研制数量',
+    align:"center",
+    dataIndex: 'yzsl',
+  },
+  {
+    title:'单台收入',
+    align:"center",
+    dataIndex: 'oneIncome',
+    isEcharts: true,
+  },
+  {
+    title:'单台成本',
+    align:"center",
+    dataIndex: 'oneCost',
+    isEcharts: true,
+  },
+  {
+    title:'单台利润',
+    align:"center",
+    dataIndex: 'oneProfit',
+    isEcharts: true,
+  },
+  {
+    title:'利润额',
+    align:"center",
+    dataIndex: 'lre',
+  },
+  {
+    title:'利润率',
+    align:"center",
+    dataIndex: 'lrl',
+  },
+  {
+    title:'预估价',
+    align:"center",
+    dataIndex: 'estimationcoat',
+  },
+  {
+    title:'合同额',
+    align:"center",
+    dataIndex: 'contractfpe',
+  },
+  {
+    title:'已收款',
+    align:"center",
+    dataIndex: 'taskmoney',
+  },
+  {
+    title:'总成本',
+    align:"center",
+    dataIndex: 'zcb',
+  },
+  {
+    title:'材料费',
+    align:"center",
+    dataIndex: 'clf',
+    isEcharts: true,
+  },
+  {
+    title:'专用费',
+    align:"center",
+    dataIndex: 'zyf',
+    isEcharts: true,
+  },
+  {
+    title:'事务费',
+    align:"center",
+    dataIndex: 'swf',
+    isEcharts: true,
+  },
+  {
+    title:'外协费',
+    align:"center",
+    dataIndex: 'wxf',
+    isEcharts: true,
+  },
+  {
+    title:'燃动费',
+    align:"center",
+    dataIndex: 'rldlf',
+    isEcharts: true,
+  },
+  {
+    title:'折旧费',
+    align:"center",
+    dataIndex: 'gdzczj',
+    isEcharts: true,
+  },
+  {
+    title:'工时费',
+    align:"center",
+    dataIndex: 'gzjlwf',
+    isEcharts: true,
+  },
+  {
+    title:'管理费',
+    align:"center",
+    dataIndex: 'glf',
+    isEcharts: true,
+  },
+  {
+    title:'装机成本',
+    align:"center",
+    dataIndex: 'zjcb',
+    isEcharts: true,
+  },
+  {
+    title:'内部试验',
+    align:"center",
+    dataIndex: 'lbsy',
+    isEcharts: true,
+  },
+  {
+    title:'工时(h)',
+    align:"center",
+    dataIndex: 'workhour',
+    isEcharts: true,
+  },
+  {
+    title:'责任部门',
+    align:"center",
+    dataIndex: 'zrbm'
+  },
+  {
+    title:'下达部门',
+    align:"center",
+    dataIndex: 'jycs'
+  },
+  {
+    title:'横向纵向',
+    align:"center",
+    dataIndex: 'hxzxname'
+  },
+  {
+    title:'任务类型',
+    align:"center",
+    dataIndex: 'tasktype'
+  },
+  {
+    title:'审计审价',
+    align:"center",
+    dataIndex: 'auditprice'
+  },
+  {
+    title:'任务状态',
+    align:"center",
+    dataIndex: 'iflag'
+  },
+  {
+    title:'提出单位简称',
+    align:"center",
+    dataIndex: 'brief'
+  },
+  {
+    title:'父级任务',
+    align:"center",
+    dataIndex: 'reftaskno'
+  },
+  {
+    title:'批产任务号',
+    align:"center",
+    dataIndex: 'pccode'
+  },
+  {
+    title:'备产任务号',
+    align:"center",
+    dataIndex: 'bccode'
+  },
+  {
+    title:'备料任务号',
+    align:"center",
+    dataIndex: 'blcode'
+  },
+  {
+    title:'业务员',
+    align:"center",
+    dataIndex: 'businessman'
+  },
+  {
+    title:'设计工时',
+    align:"center",
+    dataIndex: 'sjgs',
+  },
+  {
+    title:'生产工时',
+    align:"center",
+    dataIndex: 'scgs',
+  },
+];
 export default {
   components: { lineBarChart },
   props: {
     // 对比表格数据
     duibiList: {
-      type: Array,
+      type: Object,
       default: ()=>{},
       required: false
     }
@@ -268,6 +257,7 @@ export default {
   data() {
     return {
       tableData: [],
+      compareOne: [],
       columns,
       /* 分页参数 */
       ipagination:{
@@ -283,7 +273,7 @@ export default {
       },
       selectedMode: 'multiple',
       // echarts
-      xAxisData: ['单台成本', '收入', '利润', '材料费', '外协费', '事务费', '专用费', '工时费', '燃动费', '管理费', '折旧费', '装机成本', '内部试验', '工时']
+      // xAxisData: ['单台成本', '收入', '利润', '材料费', '外协费', '事务费', '专用费', '工时费', '燃动费', '管理费', '折旧费', '装机成本', '内部试验', '工时']
     };
   },
   watch: {
@@ -292,9 +282,18 @@ export default {
         console.log(newValue, oldValue)
         if(newValue){
           this.tableData = newValue.compareAll
-          this.seriesData = newValue.compareOne.map(res => {
-            return 
-          })
+          this.compareOne = newValue.compareOne
+          // var arr = columns.filter(cur => cur.isEcharts)
+          // var data = arr.map(res => {
+          //   var liData = this.tableData.map((item) => {
+          //     return item[res.dataIndex]
+          //   })
+          //   console.log(liData)
+          //   return {
+          //     name: res.title,
+          //     data: liData
+          //   }
+          // })
         }
       },
       deep: true,
@@ -302,32 +301,35 @@ export default {
     },
   },
   computed: {
-    // xAxisData(){
-    //   if(this.tableData.length === 0){
-    //     return []
-    //   }
-    //   var data = this.tableData.map(res => {
-    //     return res.taskno
-    //   })
-    //   console.log(data)
-    //   return data
-    // },
-    seriesData(){
+    xAxisData(){
       if(this.tableData.length === 0){
         return []
       }
       var arr = columns.filter(cur => cur.isEcharts)
       var data = arr.map(res => {
-        var liData = this.tableData.map((item) => {
-          return item[res.dataIndex]
+        return res.title
+      })
+      console.log(data)
+      return data
+    },
+    seriesData(){
+      if(this.tableData.length === 0){
+        return []
+      }
+      var arr = columns.filter(cur => cur.isEcharts)
+      var data = this.compareOne.map(res => {
+        // console.log(res)
+        var liData = arr.map((item) => {
+          console.log(item.dataIndex, res[item.dataIndex])
+          return res[item.dataIndex]
         })
-        console.log(liData)
+        // console.log(liData)
         return {
-          name: res.title,
+          name: res.taskno,
           data: liData
         }
       })
-      console.log(data)
+      // console.log(data)
       return data
     },
   },

+ 32 - 28
src/views/module_kzks/projectContrastList/components/lineBarChart.vue

@@ -17,7 +17,7 @@ export default {
     },
     selectedMode: {
       type: String,
-      default: 'single' // 'multiple'
+      default: 'multiple' // 'multiple'
     },
   },
   data () {
@@ -63,29 +63,31 @@ export default {
       // let color = ['#42CEAF', '#FF882A', '#16B4FE', '#747AFE','#f9c129', '#13c2c2', '#79ce42', '#f55837'];
       // fc8452  
       this.uOption = {
-        // title: {
-        //   text: this.title + '图',
-        //   left: 'center'
-        // },
+        title: {
+          text: '归一化展示',
+          // left: 'center',
+          left: 'left'
+        },
         // color: color,
         tooltip: {
           trigger: 'axis'
         },
         grid: {
-          left: '5%',
-          right: '5%',
-          bottom: '10%'
+          left: 60,
+          right: 20,
+          // bottom: '70px',
+          bottom: '30px'
         },
         legend: {
-          selectedMode: 'single', // 单个显示
+          selectedMode: 'multiple', // 单个显示
           type: 'scroll',
           width: '60%',
           // orient: 'vertical',
-          // right: 90,
+          right: 0,
           // left: 20,
-          top: 0,
+          // top: 60,
           // bottom: 20,
-          // selectedMode: 'single',
+          // selectedMode: 'multiple',
           padding: [
               5,  // 上
               150, // 右
@@ -97,25 +99,22 @@ export default {
           show: true,
           feature: {
             // dataView: { readOnly: false }, // 展示数据--不过没用
-            magicType: { type: ['bar', 'line'] },
+            magicType: { type: ['line', 'bar'] },
             // restore: {}, // 还原
             saveAsImage: {}
           }
         },
-        grid: {
-          bottom: '70px'
-        },
-        dataZoom: [
-          {
-            type: 'inside',
-            start: 0,
-            end: 100,
-          },
-          {
-            start: 0,
-            end: 100
-          }
-        ],
+        // dataZoom: [
+        //   {
+        //     type: 'inside',
+        //     start: 0,
+        //     end: 100,
+        //   },
+        //   {
+        //     start: 0,
+        //     end: 100
+        //   }
+        // ],
         xAxis: {
           type: 'category',
           // boundaryGap: true, // 解决数据溢出X轴的问题
@@ -123,6 +122,11 @@ export default {
         },
         yAxis: {
           type: 'value',
+          name: '单位(元)',
+          nameTextStyle: {
+            color: "#aaa",
+            nameLocation: "start",
+          },
           axisLabel: {
             // 可以动态设置是数量还是金额
             formatter: '{value} '
@@ -160,7 +164,7 @@ export default {
       this.uOption.series = seriesData.map(res => {
         return {
           name: res.name,
-          type: 'bar',
+          type: 'line',
           smooth: true,
           data: res.data,
         }

+ 20 - 10
src/views/module_kzks/projectCostList/ProjectCostList.vue

@@ -122,11 +122,11 @@
       </a-upload> -->
       <!-- 高级查询区域 -->
       <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
-      <a-button @click="batchDuiBi" :disabled="chooseStatus"><a-icon type="shrink" />比</a-button>
+      <a-button @click="batchDuiBi" :disabled="chooseStatus"><a-icon type="shrink" />比</a-button>
       <!-- <a-dropdown v-if="selectedRowKeys.length > 0"> -->
         <!-- <a-menu slot="overlay"> -->
-          <!-- <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>比</a-menu-item> -->
-          <!-- <a-menu-item key="1" @click="batchDuiBi"><a-icon type="shrink" />比</a-menu-item>
+          <!-- <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>比</a-menu-item> -->
+          <!-- <a-menu-item key="1" @click="batchDuiBi"><a-icon type="shrink" />比</a-menu-item>
         </a-menu>
         <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> -->
       <!-- </a-dropdown> -->
@@ -265,9 +265,10 @@
           </a-tooltip> -->
           <a @click="handleXushi(record)" v-if="record.id !== 'amount'">预算执行</a>
           <!-- <a @click="handleXushi(record)" v-if="record.id !== 'amount'" :disabled="record.ji === 1">预算执行</a> -->
+          <a-divider v-if="record.id !== 'amount' && record.ji === 1" type="vertical" />
+          <a @click="handleAddProjectModel(record)" v-if="record.id !== 'amount' && record.ji === 1">加入产品</a>
 
-          <!-- <a-divider type="vertical" />
-          <a-dropdown>
+          <!-- <a-dropdown>
             <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
             <a-menu slot="overlay">
               <a-menu-item>
@@ -321,7 +322,7 @@
   // import VueDraggableResizable from 'vue-draggable-resizable';
   // Vue.component('vue-draggable-resizable', VueDraggableResizable);
 
-  import { columnsSelect, columnsEdit, proCostYSKdetail, proCostContractdetail, getDbList, getHjList, getDbClList } from '@/api/kzksApi.js'
+  import { columnsSelect, columnsEdit, proCostYSKdetail, proCostContractdetail, getDbList, getHjList, getDbClList, insertIntoProject } from '@/api/kzksApi.js'
 
   import '@/assets/less/TableExpand.less'
   import { mixinDevice } from '@/utils/mixin'
@@ -380,7 +381,7 @@ import { number } from 'echarts';
         // 对比状态
         chooseStatus: true,
         // 获取到的对比数据
-        duibiList: [],
+        duibiList: {},
         // 获取到的材料费对比数据
         duibiclList: [],
         // 对比弹框是否显示
@@ -872,7 +873,7 @@ import { number } from 'echarts';
       },
       // 亏损标红
       setRowClassName(record, index){
-        console.log(record)
+        // console.log(record)
         if(record.lrl < 0){
           return 'table-kuisun-color'
         }
@@ -963,7 +964,7 @@ import { number } from 'echarts';
           }
         }
       },
-      // 
+      // 比
       batchDuiBi(){
         console.log(this.selectedRowKeys,this.selectionRows)
         // console.log(JSON.stringify(this.selectedRowKeys))
@@ -1023,7 +1024,7 @@ import { number } from 'echarts';
       // 关闭对比弹框
       handleGb(){
         this.duiBi = false
-        this.duibiList = []
+        this.duibiList = {}
         this.duibiclList = []
       },
       // 一键折叠展开
@@ -1057,6 +1058,15 @@ import { number } from 'echarts';
         console.log(record)
         this.$refs.xushi.open(record)
       },
+      // 加入产品模型
+      handleAddProjectModel(record){
+        console.log(record)
+        var arr = []
+        arr.push(record)
+        insertIntoProject(arr).then(response => {
+          console.log(response)
+        })
+      },
       // 对比禁选判断
       onSelectChange(selectedRowKeys, selectionRows) {
         this.selectedRowKeys = selectedRowKeys;

+ 4 - 4
src/views/module_kzks/projectDownloadModel/ProjectDownloadModelList.vue

@@ -25,21 +25,21 @@
     <!-- 查询区域-END -->
 
     <!-- 操作按钮区域 -->
-    <!-- <div class="table-operator">
+    <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
       <a-button type="primary" icon="download" @click="handleExportXls('模板下载')">导出</a-button>
       <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
         <a-button type="primary" icon="import">导入</a-button>
-      </a-upload> -->
+      </a-upload>
       <!-- 高级查询区域 -->
-      <!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
+      <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>
       <a-dropdown v-if="selectedRowKeys.length > 0">
         <a-menu slot="overlay">
           <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
         </a-menu>
         <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
       </a-dropdown>
-    </div> -->
+    </div>
 
     <!-- table区域-begin -->
     <div>