chenc 2 years ago
parent
commit
ce10d08146
22 changed files with 3125 additions and 78 deletions
  1. 2 1
      src/main/java/org/jeecg/common/util/OkHttpClientUtil.java
  2. 2 0
      src/main/java/org/jeecg/config/ShiroConfig.java
  3. 49 0
      src/main/java/org/jeecg/modules/archives/controller/ProjectManageArchivesController.java
  4. 12 0
      src/main/java/org/jeecg/modules/archives/entity/ProjectManageArchives.java
  5. 6 2
      src/main/java/org/jeecg/modules/contract/file/controller/ContractFileController.java
  6. 319 0
      src/main/java/org/jeecg/modules/contract/file/vue/ContractFileAndBusinessList.vue
  7. 296 0
      src/main/java/org/jeecg/modules/contract/file/vue/ContractFileList.vue
  8. 224 0
      src/main/java/org/jeecg/modules/contract/file/vue/ContractFileModularList.vue
  9. 249 0
      src/main/java/org/jeecg/modules/contract/file/vue/ContractFileProductList.vue
  10. 286 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileAndBusinessModal.vue
  11. 293 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileAndBusinessModal__Style#Drawer.vue
  12. 269 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModal.vue
  13. 276 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModal__Style#Drawer.vue
  14. 172 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModularModal.vue
  15. 179 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModularModal__Style#Drawer.vue
  16. 202 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileProductModal.vue
  17. 209 0
      src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileProductModal__Style#Drawer.vue
  18. 47 42
      src/main/resources/application-dev.yml
  19. 19 19
      src/main/resources/application-prod.yml
  20. 10 10
      src/main/resources/application-test.yml
  21. 1 1
      src/main/resources/application.yml
  22. 3 3
      src/main/resources/jeecg/jeecg_database.properties

+ 2 - 1
src/main/java/org/jeecg/common/util/OkHttpClientUtil.java

@@ -31,7 +31,8 @@ public class OkHttpClientUtil {
                 .build();
         Request reqa = new Request.Builder()
 //                .url("http://127.0.0.1:8090/jeecg-boot/actBusiness/external/apply")
-                .url("http://127.0.0.1:8090/jeecg-boot"+oaEntity.getUrl())
+//                .url("http://127.0.0.1:8090/jeecg-boot"+oaEntity.getUrl())
+                .url("http://106.15.206.14:8087/jeecg-boot"+oaEntity.getUrl())
                 .post(requestBody)
 //				 .get()
 //				 .method("POST", FormBody.create(MediaType.parse("application/json"),"" ))

+ 2 - 0
src/main/java/org/jeecg/config/ShiroConfig.java

@@ -70,6 +70,8 @@ public class ShiroConfig {
 		filterChainDefinitionMap.put("/swagger**/**", "anon");
 		filterChainDefinitionMap.put("/webjars/**", "anon");
 		filterChainDefinitionMap.put("/v2/**", "anon");
+		filterChainDefinitionMap.put("/archives/projectManageArchives/queryByIdAPI", "anon");
+
 		
 		//性能监控
 		filterChainDefinitionMap.put("/actuator/metrics/**", "anon");

+ 49 - 0
src/main/java/org/jeecg/modules/archives/controller/ProjectManageArchivesController.java

@@ -2,6 +2,8 @@ package org.jeecg.modules.archives.controller;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -32,6 +34,8 @@ import org.jeecg.modules.archives.entity.ProjectManageBusinessOther;
 import org.jeecg.modules.archives.service.ProjectManageArchivesAndBusinessService;
 import org.jeecg.modules.archives.service.ProjectManageArchivesService;
 import org.jeecg.modules.archives.service.ProjectManageBusinessOtherService;
+import org.jeecg.modules.basedata.entity.FdCustomer;
+import org.jeecg.modules.basedata.service.IFdCustomerService;
 import org.jeecg.modules.expense.entity.ReExpenseSlip;
 import org.jeecg.modules.expense.service.ReExpenseSlipService;
 import org.jeecg.modules.invoice.entity.InvoiceManagePurchase;
@@ -43,6 +47,8 @@ import org.jeecg.modules.prowork.entity.ProWorkLogic;
 import org.jeecg.modules.prowork.entity.ProWorkMilestone;
 import org.jeecg.modules.prowork.service.ProWorkLogicService;
 import org.jeecg.modules.prowork.service.ProWorkMilestoneService;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.validation.BindingResult;
@@ -83,6 +89,10 @@ public class ProjectManageArchivesController {
 	private ProWorkMilestoneService proWorkMilestoneService;
     @Autowired
 	private InvoiceManagePurchaseService invoiceManagePurchaseService;
+    @Autowired
+	private IFdCustomerService iFdCustomerService;
+    @Autowired
+	private ISysUserService iSysUserService;
 
 	@ApiOperation(value = "项目档案分页查询接口", notes = "项目档案分页查询")
 	@ApiImplicitParams({
@@ -287,6 +297,45 @@ public class ProjectManageArchivesController {
 		return result;
 	}
 
+	/**
+	* @Author chenchuang
+	* @Description //TODO OA调用项目管理接口获取数据
+	* @Date 2022/4/6 15:52
+	* @Param [jsonObject]
+	* @return org.jeecg.common.api.vo.Result<org.jeecg.modules.archives.entity.ProjectManageArchives>
+	*/
+	@PostMapping(value = "/queryByIdAPI")
+	public Result<ProjectManageArchives> queryByIdAPI(@RequestBody JSONObject jsonObject) {
+		String id="";
+		if(jsonObject!=null){
+			id=jsonObject.get("id").toString();
+		}
+		Result<ProjectManageArchives> result = new Result<ProjectManageArchives>();
+		ProjectManageArchives projectManageArchives = projectManageArchivesService.getById(id);
+		//获取客户地址与联系人
+		if(StringUtils.isNotBlank(projectManageArchives.getCusId())){
+			FdCustomer fdCustomer= iFdCustomerService.getById(projectManageArchives.getCusId());
+			if(fdCustomer!=null){
+				projectManageArchives.setAddress(fdCustomer.getAddress());//地址
+				projectManageArchives.setContacts(fdCustomer.getContacts());//联系人
+			}
+		}
+		//获取项目经理用户名
+		if(StringUtils.isNotBlank(projectManageArchives.getSaleManagerId())){
+			SysUser sysUser= iSysUserService.getById(projectManageArchives.getSaleManagerId());
+			if(sysUser!=null){
+				projectManageArchives.setSaleManagerUserName(sysUser.getUsername());
+			}
+		}
+		if(projectManageArchives==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(projectManageArchives);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
 	@ApiOperation(value = "项目档案主子表查询接口", notes = "根据id查询项目档案主子表")
 	@ApiImplicitParams({
 			@ApiImplicitParam(name="id", value="id",required=true, dataType="String")

+ 12 - 0
src/main/java/org/jeecg/modules/archives/entity/ProjectManageArchives.java

@@ -95,6 +95,18 @@ public class ProjectManageArchives implements Serializable {
     //合同档案id
     private String contractFileId;
 
+    //客户地址
+    @TableField(exist = false)
+    private String address;
+
+    //客户联系人
+    @TableField(exist = false)
+    private String contacts;
+
+    //项目经理用户名
+    @TableField(exist = false)
+    private String saleManagerUserName;
+
     public ProjectManageArchives() {
     }
 

+ 6 - 2
src/main/java/org/jeecg/modules/contract/file/controller/ContractFileController.java

@@ -9,6 +9,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.util.oaEntity.OaEntity;
@@ -26,6 +27,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.extern.slf4j.Slf4j;
 
+import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysDictService;
 import org.jeecg.modules.system.service.ISysSerialPatternService;
 import org.jeecg.modules.system.vo.CallResult;
@@ -438,8 +440,10 @@ public class ContractFileController {
 		  //参数
 		  OaEntity oaEntity = new OaEntity();
 		  oaEntity.setUrl("/actBusiness/external/apply");
-		  oaEntity.setExternalUsername("chenc");
-		  oaEntity.setProcDefId("测试外部流程:1:175034");
+		  SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
+		  oaEntity.setExternalUsername(user.getUsername());
+//		  oaEntity.setProcDefId("公用测试流程:1:182509");
+		  oaEntity.setProcDefId("ht合同审批:1:192507");
 		  oaEntity.setTableName("外部表单contract-file");
 		  //获取项目立项名称
 		  BaseArchivesProjectApproval projectApproval= baseArchivesProjectApprovalService.getById(contractFile.getProId());

+ 319 - 0
src/main/java/org/jeecg/modules/contract/file/vue/ContractFileAndBusinessList.vue

@@ -0,0 +1,319 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="合同主表id">
+              <a-input placeholder="请输入合同主表id" v-model="queryParam.contractFileId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="删除状态(0,正常,1已删除)">
+              <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-model="queryParam.delFlag"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="描述1">
+              <a-input placeholder="请输入描述1" v-model="queryParam.desc1"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="描述2">
+              <a-input placeholder="请输入描述2" v-model="queryParam.desc2"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="描述3">
+              <a-input placeholder="请输入描述3" v-model="queryParam.desc3"></a-input>
+            </a-form-item>
+          </a-col>
+        </template>
+          <a-col :md="6" :sm="8" >
+            <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>
+
+    <!-- 操作按钮区域 -->
+    <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" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <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"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <contractFileAndBusiness-modal ref="modalForm" @ok="modalFormOk"></contractFileAndBusiness-modal>
+  </a-card>
+</template>
+
+<script>
+  import ContractFileAndBusinessModal from './modules/ContractFileAndBusinessModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "ContractFileAndBusinessList",
+    mixins:[JeecgListMixin],
+    components: {
+      ContractFileAndBusinessModal
+    },
+    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: 'contractFileId'
+           },
+		   {
+            title: '删除状态(0,正常,1已删除)',
+            align:"center",
+            dataIndex: 'delFlag'
+           },
+		   {
+            title: '描述1',
+            align:"center",
+            dataIndex: 'desc1'
+           },
+		   {
+            title: '描述2',
+            align:"center",
+            dataIndex: 'desc2'
+           },
+		   {
+            title: '描述3',
+            align:"center",
+            dataIndex: 'desc3'
+           },
+		   {
+            title: '描述4',
+            align:"center",
+            dataIndex: 'desc4'
+           },
+		   {
+            title: '描述5',
+            align:"center",
+            dataIndex: 'desc5'
+           },
+		   {
+            title: '备注',
+            align:"center",
+            dataIndex: 'memo'
+           },
+		   {
+            title: '里程碑id1',
+            align:"center",
+            dataIndex: 'mileId1'
+           },
+		   {
+            title: '里程碑id2',
+            align:"center",
+            dataIndex: 'mileId2'
+           },
+		   {
+            title: '里程碑id3',
+            align:"center",
+            dataIndex: 'mileId3'
+           },
+		   {
+            title: '里程碑id4',
+            align:"center",
+            dataIndex: 'mileId4'
+           },
+		   {
+            title: '里程碑id5',
+            align:"center",
+            dataIndex: 'mileId5'
+           },
+		   {
+            title: '对应里程碑1',
+            align:"center",
+            dataIndex: 'milestone1'
+           },
+		   {
+            title: '对应里程碑2',
+            align:"center",
+            dataIndex: 'milestone2'
+           },
+		   {
+            title: '对应里程碑3',
+            align:"center",
+            dataIndex: 'milestone3'
+           },
+		   {
+            title: '对应里程碑4',
+            align:"center",
+            dataIndex: 'milestone4'
+           },
+		   {
+            title: '对应里程碑5',
+            align:"center",
+            dataIndex: 'milestone5'
+           },
+		   {
+            title: '组织',
+            align:"center",
+            dataIndex: 'pkOrg'
+           },
+		   {
+            title: '计划名称id',
+            align:"center",
+            dataIndex: 'planId'
+           },
+		   {
+            title: '计划名称',
+            align:"center",
+            dataIndex: 'planName'
+           },
+		   {
+            title: '计划类型 1.收款计划 2.回款情况 3.付款计划 4.付款情况',
+            align:"center",
+            dataIndex: 'planType'
+           },
+		   {
+            title: '第一笔',
+            align:"center",
+            dataIndex: 'price1'
+           },
+		   {
+            title: '第二笔',
+            align:"center",
+            dataIndex: 'price2'
+           },
+		   {
+            title: '第三笔',
+            align:"center",
+            dataIndex: 'price3'
+           },
+		   {
+            title: '第四笔',
+            align:"center",
+            dataIndex: 'price4'
+           },
+		   {
+            title: '第五笔',
+            align:"center",
+            dataIndex: 'price5'
+           },
+		   {
+            title: '序号',
+            align:"center",
+            dataIndex: 'sort'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/contract.file/contractFileAndBusiness/list",
+          delete: "/contract.file/contractFileAndBusiness/delete",
+          deleteBatch: "/contract.file/contractFileAndBusiness/deleteBatch",
+          exportXlsUrl: "contract.file/contractFileAndBusiness/exportXls",
+          importExcelUrl: "contract.file/contractFileAndBusiness/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

+ 296 - 0
src/main/java/org/jeecg/modules/contract/file/vue/ContractFileList.vue

@@ -0,0 +1,296 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="免费售后起始">
+              <a-input placeholder="请输入免费售后起始" v-model="queryParam.
+freeAfterSalesStart"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="应收账款">
+              <a-input placeholder="请输入应收账款" v-model="queryParam.accountsReceivable"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="业务类型(数据字典)">
+              <a-input placeholder="请输入业务类型(数据字典)" v-model="queryParam.businessTypeDictId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="合同编码">
+              <a-input placeholder="请输入合同编码" v-model="queryParam.code"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="合同费用">
+              <a-input placeholder="请输入合同费用" v-model="queryParam.contractCost"></a-input>
+            </a-form-item>
+          </a-col>
+        </template>
+          <a-col :md="6" :sm="8" >
+            <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>
+
+    <!-- 操作按钮区域 -->
+    <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" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <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"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <contractFile-modal ref="modalForm" @ok="modalFormOk"></contractFile-modal>
+  </a-card>
+</template>
+
+<script>
+  import ContractFileModal from './modules/ContractFileModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "ContractFileList",
+    mixins:[JeecgListMixin],
+    components: {
+      ContractFileModal
+    },
+    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: '
+freeAfterSalesStart'
+           },
+		   {
+            title: '应收账款',
+            align:"center",
+            dataIndex: 'accountsReceivable'
+           },
+		   {
+            title: '业务类型(数据字典)',
+            align:"center",
+            dataIndex: 'businessTypeDictId'
+           },
+		   {
+            title: '合同编码',
+            align:"center",
+            dataIndex: 'code'
+           },
+		   {
+            title: '合同费用',
+            align:"center",
+            dataIndex: 'contractCost'
+           },
+		   {
+            title: '合同日期',
+            align:"center",
+            dataIndex: 'contractDate'
+           },
+		   {
+            title: '合同利润',
+            align:"center",
+            dataIndex: 'contractProfit'
+           },
+		   {
+            title: '成本',
+            align:"center",
+            dataIndex: 'cost'
+           },
+		   {
+            title: '删除状态(0,正常,1已删除)',
+            align:"center",
+            dataIndex: 'delFlag'
+           },
+		   {
+            title: '折扣率',
+            align:"center",
+            dataIndex: 'discountRate'
+           },
+		   {
+            title: '客户id(客户档案id)',
+            align:"center",
+            dataIndex: 'fdCustomerId'
+           },
+		   {
+            title: '客户人员id(客户档案联系人id)',
+            align:"center",
+            dataIndex: 'fdCustomerPersonnelId'
+           },
+		   {
+            title: '免费售后截至',
+            align:"center",
+            dataIndex: 'freeAfterSalesEnd'
+           },
+		   {
+            title: '赠品金额',
+            align:"center",
+            dataIndex: 'giftAmount'
+           },
+		   {
+            title: '备注',
+            align:"center",
+            dataIndex: 'memo'
+           },
+		   {
+            title: '里程碑类型id(数据字典)',
+            align:"center",
+            dataIndex: 'milestoneId'
+           },
+		   {
+            title: '合同概述',
+            align:"center",
+            dataIndex: 'overview'
+           },
+		   {
+            title: '业绩计算率',
+            align:"center",
+            dataIndex: 'performanceCalculationRate'
+           },
+		   {
+            title: '组织',
+            align:"center",
+            dataIndex: 'pkOrg'
+           },
+		   {
+            title: '销售部门id',
+            align:"center",
+            dataIndex: 'salesDepartmentId'
+           },
+		   {
+            title: '销售部门名称',
+            align:"center",
+            dataIndex: 'salesDepartmentName'
+           },
+		   {
+            title: '标准报价',
+            align:"center",
+            dataIndex: 'standardQuotation'
+           },
+		   {
+            title: '成交金额',
+            align:"center",
+            dataIndex: 'transactionAmount'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/contract.file/contractFile/list",
+          delete: "/contract.file/contractFile/delete",
+          deleteBatch: "/contract.file/contractFile/deleteBatch",
+          exportXlsUrl: "contract.file/contractFile/exportXls",
+          importExcelUrl: "contract.file/contractFile/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

+ 224 - 0
src/main/java/org/jeecg/modules/contract/file/vue/ContractFileModularList.vue

@@ -0,0 +1,224 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="产品模块编码">
+              <a-input placeholder="请输入产品模块编码" v-model="queryParam.code"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="合同产品id">
+              <a-input placeholder="请输入合同产品id" v-model="queryParam.contractFileProductId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="删除状态(0,正常,1已删除)">
+              <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-model="queryParam.delFlag"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="备注">
+              <a-input placeholder="请输入备注" v-model="queryParam.memo"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="产品模块名称">
+              <a-input placeholder="请输入产品模块名称" v-model="queryParam.name"></a-input>
+            </a-form-item>
+          </a-col>
+        </template>
+          <a-col :md="6" :sm="8" >
+            <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>
+
+    <!-- 操作按钮区域 -->
+    <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" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <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"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <contractFileModular-modal ref="modalForm" @ok="modalFormOk"></contractFileModular-modal>
+  </a-card>
+</template>
+
+<script>
+  import ContractFileModularModal from './modules/ContractFileModularModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "ContractFileModularList",
+    mixins:[JeecgListMixin],
+    components: {
+      ContractFileModularModal
+    },
+    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: 'code'
+           },
+		   {
+            title: '合同产品id',
+            align:"center",
+            dataIndex: 'contractFileProductId'
+           },
+		   {
+            title: '删除状态(0,正常,1已删除)',
+            align:"center",
+            dataIndex: 'delFlag'
+           },
+		   {
+            title: '备注',
+            align:"center",
+            dataIndex: 'memo'
+           },
+		   {
+            title: '产品模块名称',
+            align:"center",
+            dataIndex: 'name'
+           },
+		   {
+            title: '组织',
+            align:"center",
+            dataIndex: 'pkOrg'
+           },
+		   {
+            title: '采购价格',
+            align:"center",
+            dataIndex: 'purchasePrice'
+           },
+		   {
+            title: '排序',
+            align:"center",
+            dataIndex: 'sort'
+           },
+		   {
+            title: '标准价格',
+            align:"center",
+            dataIndex: 'standardQuotation'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/contract.file/contractFileModular/list",
+          delete: "/contract.file/contractFileModular/delete",
+          deleteBatch: "/contract.file/contractFileModular/deleteBatch",
+          exportXlsUrl: "contract.file/contractFileModular/exportXls",
+          importExcelUrl: "contract.file/contractFileModular/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

+ 249 - 0
src/main/java/org/jeecg/modules/contract/file/vue/ContractFileProductList.vue

@@ -0,0 +1,249 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="折扣后金额">
+              <a-input placeholder="请输入折扣后金额" v-model="queryParam.amountAfterDiscount"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="物料档案产品id">
+              <a-input placeholder="请输入物料档案产品id" v-model="queryParam.baseMaterialFileProductId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="产品编码">
+              <a-input placeholder="请输入产品编码" v-model="queryParam.code"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="主表id">
+              <a-input placeholder="请输入主表id" v-model="queryParam.contractFileId"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="成本金额">
+              <a-input placeholder="请输入成本金额" v-model="queryParam.costAmount"></a-input>
+            </a-form-item>
+          </a-col>
+        </template>
+          <a-col :md="6" :sm="8" >
+            <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>
+
+    <!-- 操作按钮区域 -->
+    <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" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <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"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <contractFileProduct-modal ref="modalForm" @ok="modalFormOk"></contractFileProduct-modal>
+  </a-card>
+</template>
+
+<script>
+  import ContractFileProductModal from './modules/ContractFileProductModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "ContractFileProductList",
+    mixins:[JeecgListMixin],
+    components: {
+      ContractFileProductModal
+    },
+    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: 'amountAfterDiscount'
+           },
+		   {
+            title: '物料档案产品id',
+            align:"center",
+            dataIndex: 'baseMaterialFileProductId'
+           },
+		   {
+            title: '产品编码',
+            align:"center",
+            dataIndex: 'code'
+           },
+		   {
+            title: '主表id',
+            align:"center",
+            dataIndex: 'contractFileId'
+           },
+		   {
+            title: '成本金额',
+            align:"center",
+            dataIndex: 'costAmount'
+           },
+		   {
+            title: '成本单价',
+            align:"center",
+            dataIndex: 'costUnitPrice'
+           },
+		   {
+            title: '删除状态(0,正常,1已删除)',
+            align:"center",
+            dataIndex: 'delFlag'
+           },
+		   {
+            title: '备注',
+            align:"center",
+            dataIndex: 'memo'
+           },
+		   {
+            title: '产品名称',
+            align:"center",
+            dataIndex: 'name'
+           },
+		   {
+            title: '组织',
+            align:"center",
+            dataIndex: 'pkOrg'
+           },
+		   {
+            title: '排序',
+            align:"center",
+            dataIndex: 'sort'
+           },
+		   {
+            title: '标准金额',
+            align:"center",
+            dataIndex: 'standardAmount'
+           },
+		   {
+            title: '标准报价',
+            align:"center",
+            dataIndex: 'standardQuotation'
+           },
+		   {
+            title: '折扣后单价',
+            align:"center",
+            dataIndex: 'unitPriceAfterDiscount'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/contract.file/contractFileProduct/list",
+          delete: "/contract.file/contractFileProduct/delete",
+          deleteBatch: "/contract.file/contractFileProduct/deleteBatch",
+          exportXlsUrl: "contract.file/contractFileProduct/exportXls",
+          importExcelUrl: "contract.file/contractFileProduct/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 3px
+  }
+  .ant-card-body .table-operator{
+    margin-bottom: 18px;
+  }
+  .ant-table-tbody .ant-table-row td{
+    padding-top:15px;
+    padding-bottom:15px;
+  }
+  .anty-row-operator button{margin: 0 5px}
+  .ant-btn-danger{background-color: #ffffff}
+
+  .ant-modal-cust-warp{height: 100%}
+  .ant-modal-cust-warp .ant-modal-body{height:calc(100% - 110px) !important;overflow-y: auto}
+  .ant-modal-cust-warp .ant-modal-content{height:90% !important;overflow-y: hidden}
+</style>

+ 286 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileAndBusinessModal.vue

@@ -0,0 +1,286 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同主表id">
+          <a-input placeholder="请输入合同主表id" v-decorator="['contractFileId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述1">
+          <a-input placeholder="请输入描述1" v-decorator="['desc1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述2">
+          <a-input placeholder="请输入描述2" v-decorator="['desc2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述3">
+          <a-input placeholder="请输入描述3" v-decorator="['desc3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述4">
+          <a-input placeholder="请输入描述4" v-decorator="['desc4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述5">
+          <a-input placeholder="请输入描述5" v-decorator="['desc5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id1">
+          <a-input placeholder="请输入里程碑id1" v-decorator="['mileId1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id2">
+          <a-input placeholder="请输入里程碑id2" v-decorator="['mileId2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id3">
+          <a-input placeholder="请输入里程碑id3" v-decorator="['mileId3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id4">
+          <a-input placeholder="请输入里程碑id4" v-decorator="['mileId4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id5">
+          <a-input placeholder="请输入里程碑id5" v-decorator="['mileId5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑1">
+          <a-input placeholder="请输入对应里程碑1" v-decorator="['milestone1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑2">
+          <a-input placeholder="请输入对应里程碑2" v-decorator="['milestone2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑3">
+          <a-input placeholder="请输入对应里程碑3" v-decorator="['milestone3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑4">
+          <a-input placeholder="请输入对应里程碑4" v-decorator="['milestone4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑5">
+          <a-input placeholder="请输入对应里程碑5" v-decorator="['milestone5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划名称id">
+          <a-input placeholder="请输入计划名称id" v-decorator="['planId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划名称">
+          <a-input placeholder="请输入计划名称" v-decorator="['planName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划类型 1.收款计划 2.回款情况 3.付款计划 4.付款情况">
+          <a-input placeholder="请输入计划类型 1.收款计划 2.回款情况 3.付款计划 4.付款情况" v-decorator="['planType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第一笔">
+          <a-input-number v-decorator="[ 'price1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第二笔">
+          <a-input-number v-decorator="[ 'price2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第三笔">
+          <a-input-number v-decorator="[ 'price3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第四笔">
+          <a-input-number v-decorator="[ 'price4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第五笔">
+          <a-input-number v-decorator="[ 'price5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="序号">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileAndBusinessModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileAndBusiness/add",
+          edit: "/contract.file/contractFileAndBusiness/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'contractFileId','delFlag','desc1','desc2','desc3','desc4','desc5','memo','mileId1','mileId2','mileId3','mileId4','mileId5','milestone1','milestone2','milestone3','milestone4','milestone5','pkOrg','planId','planName','planType','price1','price2','price3','price4','price5','sort'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 293 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileAndBusinessModal__Style#Drawer.vue

@@ -0,0 +1,293 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同主表id">
+          <a-input placeholder="请输入合同主表id" v-decorator="['contractFileId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述1">
+          <a-input placeholder="请输入描述1" v-decorator="['desc1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述2">
+          <a-input placeholder="请输入描述2" v-decorator="['desc2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述3">
+          <a-input placeholder="请输入描述3" v-decorator="['desc3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述4">
+          <a-input placeholder="请输入描述4" v-decorator="['desc4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="描述5">
+          <a-input placeholder="请输入描述5" v-decorator="['desc5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id1">
+          <a-input placeholder="请输入里程碑id1" v-decorator="['mileId1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id2">
+          <a-input placeholder="请输入里程碑id2" v-decorator="['mileId2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id3">
+          <a-input placeholder="请输入里程碑id3" v-decorator="['mileId3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id4">
+          <a-input placeholder="请输入里程碑id4" v-decorator="['mileId4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑id5">
+          <a-input placeholder="请输入里程碑id5" v-decorator="['mileId5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑1">
+          <a-input placeholder="请输入对应里程碑1" v-decorator="['milestone1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑2">
+          <a-input placeholder="请输入对应里程碑2" v-decorator="['milestone2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑3">
+          <a-input placeholder="请输入对应里程碑3" v-decorator="['milestone3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑4">
+          <a-input placeholder="请输入对应里程碑4" v-decorator="['milestone4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="对应里程碑5">
+          <a-input placeholder="请输入对应里程碑5" v-decorator="['milestone5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划名称id">
+          <a-input placeholder="请输入计划名称id" v-decorator="['planId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划名称">
+          <a-input placeholder="请输入计划名称" v-decorator="['planName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="计划类型 1.收款计划 2.回款情况 3.付款计划 4.付款情况">
+          <a-input placeholder="请输入计划类型 1.收款计划 2.回款情况 3.付款计划 4.付款情况" v-decorator="['planType', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第一笔">
+          <a-input-number v-decorator="[ 'price1', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第二笔">
+          <a-input-number v-decorator="[ 'price2', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第三笔">
+          <a-input-number v-decorator="[ 'price3', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第四笔">
+          <a-input-number v-decorator="[ 'price4', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="第五笔">
+          <a-input-number v-decorator="[ 'price5', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="序号">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileAndBusinessModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileAndBusiness/add",
+          edit: "/contract.file/contractFileAndBusiness/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'contractFileId','delFlag','desc1','desc2','desc3','desc4','desc5','memo','mileId1','mileId2','mileId3','mileId4','mileId5','milestone1','milestone2','milestone3','milestone4','milestone5','pkOrg','planId','planName','planType','price1','price2','price3','price4','price5','sort'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 269 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModal.vue

@@ -0,0 +1,269 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="免费售后起始">
+          <a-date-picker v-decorator="[ '
+freeAfterSalesStart', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应收账款">
+          <a-input-number v-decorator="[ 'accountsReceivable', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="业务类型(数据字典)">
+          <a-input placeholder="请输入业务类型(数据字典)" v-decorator="['businessTypeDictId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同编码">
+          <a-input placeholder="请输入合同编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同费用">
+          <a-input-number v-decorator="[ 'contractCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同日期">
+          <a-date-picker v-decorator="[ 'contractDate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同利润">
+          <a-input-number v-decorator="[ 'contractProfit', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣率">
+          <a-input-number v-decorator="[ 'discountRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="客户id(客户档案id)">
+          <a-input placeholder="请输入客户id(客户档案id)" v-decorator="['fdCustomerId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="客户人员id(客户档案联系人id)">
+          <a-input placeholder="请输入客户人员id(客户档案联系人id)" v-decorator="['fdCustomerPersonnelId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="免费售后截至">
+          <a-date-picker v-decorator="[ 'freeAfterSalesEnd', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="赠品金额">
+          <a-input-number v-decorator="[ 'giftAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑类型id(数据字典)">
+          <a-input placeholder="请输入里程碑类型id(数据字典)" v-decorator="['milestoneId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同概述">
+          <a-input placeholder="请输入合同概述" v-decorator="['overview', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="业绩计算率">
+          <a-input-number v-decorator="[ 'performanceCalculationRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="销售部门id">
+          <a-input placeholder="请输入销售部门id" v-decorator="['salesDepartmentId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="销售部门名称">
+          <a-input placeholder="请输入销售部门名称" v-decorator="['salesDepartmentName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准报价">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成交金额">
+          <a-input-number v-decorator="[ 'transactionAmount', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFile/add",
+          edit: "/contract.file/contractFile/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountsReceivable','businessTypeDictId','code','contractCost','contractProfit','cost','delFlag','discountRate','fdCustomerId','fdCustomerPersonnelId','giftAmount','memo','milestoneId','overview','performanceCalculationRate','pkOrg','salesDepartmentId','salesDepartmentName','standardQuotation','transactionAmount'))
+		  //时间格式化
+          this.form.setFieldsValue({
+freeAfterSalesStart:this.model.
+freeAfterSalesStart?moment(this.model.
+freeAfterSalesStart):null})
+          this.form.setFieldsValue({contractDate:this.model.contractDate?moment(this.model.contractDate):null})
+          this.form.setFieldsValue({freeAfterSalesEnd:this.model.freeAfterSalesEnd?moment(this.model.freeAfterSalesEnd):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.
+freeAfterSalesStart = formData.
+freeAfterSalesStart?formData.
+freeAfterSalesStart.format():null;
+            formData.contractDate = formData.contractDate?formData.contractDate.format():null;
+            formData.freeAfterSalesEnd = formData.freeAfterSalesEnd?formData.freeAfterSalesEnd.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 276 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModal__Style#Drawer.vue

@@ -0,0 +1,276 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="免费售后起始">
+          <a-date-picker v-decorator="[ '
+freeAfterSalesStart', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="应收账款">
+          <a-input-number v-decorator="[ 'accountsReceivable', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="业务类型(数据字典)">
+          <a-input placeholder="请输入业务类型(数据字典)" v-decorator="['businessTypeDictId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同编码">
+          <a-input placeholder="请输入合同编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同费用">
+          <a-input-number v-decorator="[ 'contractCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同日期">
+          <a-date-picker v-decorator="[ 'contractDate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同利润">
+          <a-input-number v-decorator="[ 'contractProfit', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣率">
+          <a-input-number v-decorator="[ 'discountRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="客户id(客户档案id)">
+          <a-input placeholder="请输入客户id(客户档案id)" v-decorator="['fdCustomerId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="客户人员id(客户档案联系人id)">
+          <a-input placeholder="请输入客户人员id(客户档案联系人id)" v-decorator="['fdCustomerPersonnelId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="免费售后截至">
+          <a-date-picker v-decorator="[ 'freeAfterSalesEnd', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="赠品金额">
+          <a-input-number v-decorator="[ 'giftAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="里程碑类型id(数据字典)">
+          <a-input placeholder="请输入里程碑类型id(数据字典)" v-decorator="['milestoneId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同概述">
+          <a-input placeholder="请输入合同概述" v-decorator="['overview', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="业绩计算率">
+          <a-input-number v-decorator="[ 'performanceCalculationRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="销售部门id">
+          <a-input placeholder="请输入销售部门id" v-decorator="['salesDepartmentId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="销售部门名称">
+          <a-input placeholder="请输入销售部门名称" v-decorator="['salesDepartmentName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准报价">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成交金额">
+          <a-input-number v-decorator="[ 'transactionAmount', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFile/add",
+          edit: "/contract.file/contractFile/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountsReceivable','businessTypeDictId','code','contractCost','contractProfit','cost','delFlag','discountRate','fdCustomerId','fdCustomerPersonnelId','giftAmount','memo','milestoneId','overview','performanceCalculationRate','pkOrg','salesDepartmentId','salesDepartmentName','standardQuotation','transactionAmount'))
+		  //时间格式化
+          this.form.setFieldsValue({
+freeAfterSalesStart:this.model.
+freeAfterSalesStart?moment(this.model.
+freeAfterSalesStart):null})
+          this.form.setFieldsValue({contractDate:this.model.contractDate?moment(this.model.contractDate):null})
+          this.form.setFieldsValue({freeAfterSalesEnd:this.model.freeAfterSalesEnd?moment(this.model.freeAfterSalesEnd):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.
+freeAfterSalesStart = formData.
+freeAfterSalesStart?formData.
+freeAfterSalesStart.format():null;
+            formData.contractDate = formData.contractDate?formData.contractDate.format():null;
+            formData.freeAfterSalesEnd = formData.freeAfterSalesEnd?formData.freeAfterSalesEnd.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 172 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModularModal.vue

@@ -0,0 +1,172 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品模块编码">
+          <a-input placeholder="请输入产品模块编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同产品id">
+          <a-input placeholder="请输入合同产品id" v-decorator="['contractFileProductId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品模块名称">
+          <a-input placeholder="请输入产品模块名称" v-decorator="['name', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="采购价格">
+          <a-input-number v-decorator="[ 'purchasePrice', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准价格">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileModularModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileModular/add",
+          edit: "/contract.file/contractFileModular/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'code','contractFileProductId','delFlag','memo','name','pkOrg','purchasePrice','sort','standardQuotation'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 179 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileModularModal__Style#Drawer.vue

@@ -0,0 +1,179 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品模块编码">
+          <a-input placeholder="请输入产品模块编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="合同产品id">
+          <a-input placeholder="请输入合同产品id" v-decorator="['contractFileProductId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品模块名称">
+          <a-input placeholder="请输入产品模块名称" v-decorator="['name', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="采购价格">
+          <a-input-number v-decorator="[ 'purchasePrice', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准价格">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileModularModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileModular/add",
+          edit: "/contract.file/contractFileModular/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'code','contractFileProductId','delFlag','memo','name','pkOrg','purchasePrice','sort','standardQuotation'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 202 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileProductModal.vue

@@ -0,0 +1,202 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣后金额">
+          <a-input-number v-decorator="[ 'amountAfterDiscount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="物料档案产品id">
+          <a-input placeholder="请输入物料档案产品id" v-decorator="['baseMaterialFileProductId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品编码">
+          <a-input placeholder="请输入产品编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="主表id">
+          <a-input placeholder="请输入主表id" v-decorator="['contractFileId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本金额">
+          <a-input-number v-decorator="[ 'costAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本单价">
+          <a-input-number v-decorator="[ 'costUnitPrice', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品名称">
+          <a-input placeholder="请输入产品名称" v-decorator="['name', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准金额">
+          <a-input-number v-decorator="[ 'standardAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准报价">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣后单价">
+          <a-input-number v-decorator="[ 'unitPriceAfterDiscount', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileProductModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileProduct/add",
+          edit: "/contract.file/contractFileProduct/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'amountAfterDiscount','baseMaterialFileProductId','code','contractFileId','costAmount','costUnitPrice','delFlag','memo','name','pkOrg','sort','standardAmount','standardQuotation','unitPriceAfterDiscount'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 209 - 0
src/main/java/org/jeecg/modules/contract/file/vue/modules/ContractFileProductModal__Style#Drawer.vue

@@ -0,0 +1,209 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣后金额">
+          <a-input-number v-decorator="[ 'amountAfterDiscount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="物料档案产品id">
+          <a-input placeholder="请输入物料档案产品id" v-decorator="['baseMaterialFileProductId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品编码">
+          <a-input placeholder="请输入产品编码" v-decorator="['code', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="主表id">
+          <a-input placeholder="请输入主表id" v-decorator="['contractFileId', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本金额">
+          <a-input-number v-decorator="[ 'costAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="成本单价">
+          <a-input-number v-decorator="[ 'costUnitPrice', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="删除状态(0,正常,1已删除)">
+          <a-input placeholder="请输入删除状态(0,正常,1已删除)" v-decorator="['delFlag', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="备注">
+          <a-input placeholder="请输入备注" v-decorator="['memo', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="产品名称">
+          <a-input placeholder="请输入产品名称" v-decorator="['name', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="组织">
+          <a-input placeholder="请输入组织" v-decorator="['pkOrg', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="排序">
+          <a-input-number v-decorator="[ 'sort', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准金额">
+          <a-input-number v-decorator="[ 'standardAmount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="标准报价">
+          <a-input-number v-decorator="[ 'standardQuotation', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="折扣后单价">
+          <a-input-number v-decorator="[ 'unitPriceAfterDiscount', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "ContractFileProductModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        },
+        url: {
+          add: "/contract.file/contractFileProduct/add",
+          edit: "/contract.file/contractFileProduct/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'amountAfterDiscount','baseMaterialFileProductId','code','contractFileId','costAmount','costUnitPrice','delFlag','memo','name','pkOrg','sort','standardAmount','standardQuotation','unitPriceAfterDiscount'))
+		  //时间格式化
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 47 - 42
src/main/resources/application-dev.yml

@@ -1,32 +1,38 @@
 server:
-  port: 8080
-  servlet:
-    context-path: /jeecg-boot
-    compression:
-      enabled: true
-      mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
-        
+    port: 8086
+    servlet:
+       context-path: /fangda
+       compression:
+         enabled: true
+         mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*
+
 management:
  endpoints:
   web:
    exposure:
     include: metrics,httptrace
-    
+
 spring:
   mail:
+#    host: smtp.office365.com
+#    username: smtpaccount@frontagelab.com.cn
+#    password: Frontagelab2019
+#    host: smtp.frontagelab.com.cn
+#    username: itgroup@frontagelab.com.cn
+#    password: Welcome2019
     host: smtp.163.com
-    username: jeecgos@163.com
-    password: ??
+    username: 17887951939@163.com
+    password: kabuqinuo5276
     properties:
-      mail: 
-        smtp: 
+      mail:
+        smtp:
           auth: true
-          starttls: 
+          starttls:
             enable: true
             required: true
   ## quartz定时任务,采用数据库方式
   quartz:
-    job-store-type: jdbc
+     job-store-type: jdbc
   #json 时间戳统一转换
   jackson:
     date-format:   yyyy-MM-dd HH:mm:ss
@@ -66,7 +72,7 @@ spring:
         min-idle: 5
         maxActive: 20
         # 配置获取连接等待超时的时间
-        maxWait: 60000
+        maxWait: 600000
         # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
         timeBetweenEvictionRunsMillis: 60000
         # 配置一个连接在池中最小生存的时间,单位是毫秒
@@ -79,42 +85,38 @@ spring:
         poolPreparedStatements: true
         maxPoolPreparedStatementPerConnectionSize: 20
         # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
-        filters: stat,wall,slf4j
+        filters: stat,slf4j
+        # ,wall
         # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
-        master:
-          url: jdbc:mysql://103.40.192.17:3306/banma_dev?characterEncoding=UTF-8&useUnicode=true&useSSL=false
-          username: root
-          password: CuiDian1234
-          driver-class-name: com.mysql.jdbc.Driver
+          master:
+            url: jdbc:mysql://127.0.0.1:3306/cd_project_management?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
+            username: root
+            password: CuiDian1234
+            driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:
-          #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
-          #username: root
-          #password: root
-          #driver-class-name: com.mysql.jdbc.Driver
+            #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
+            #username: root
+            #password: root
+            #driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:
-    database: 0
-    host: 127.0.0.1
-    lettuce:
-      pool:
-        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
-        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
-        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
-        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
-      shutdown-timeout: 100ms
-    password: ''
-    port: 6379
+     database: 0
+     host: 140.143.16.246
+     lettuce:
+       pool:
+         max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+         max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+       shutdown-timeout: 100ms
+     password: 'fenghaifu'
+     port: 14330
 #mybatis plus 设置
 mybatis-plus:
-  mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
-  global-config:
-    db-config:
-      logic-delete-value: 1 #逻辑已删除值(默认值为1)
-      logic-not-delete-value: 0 #逻辑未删除值(默认值为0)
-
+   mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
 #jeecg专用配置
 jeecg :
   path :
@@ -122,3 +124,6 @@ jeecg :
     upload: D://upFiles
     #webapp文件路径
     webapp: D://webapp
+logging:
+  level:
+    org.jeecg.modules.system.mapper : debug

+ 19 - 19
src/main/resources/application-prod.yml

@@ -1,5 +1,5 @@
 server:
-    port: 10022
+    port: 8086
     servlet:
        context-path: /fangda
        compression:
@@ -88,9 +88,9 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
           master:
-            url: jdbc:mysql://10.21.2.113:3306/fangda_prod?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false
+            url: jdbc:mysql://127.0.0.1:3306/cd_project_management?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
             username: root
-            password: root
+            password: CuiDian1234
             driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:
@@ -99,22 +99,9 @@ spring:
             #password: root
             #driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
-#  redis:
-#     database: 0
-#     host: 127.0.0.1
-#     lettuce:
-#       pool:
-#         max-active: 8   #最大连接数据库连接数,设 0 为没有限制
-#         max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
-#         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
-#         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
-#       shutdown-timeout: 100ms
-#     password: ''
-#     port: 6379
-
   redis:
      database: 0
-     host: 140.143.16.246
+     host: 127.0.0.1
      lettuce:
        pool:
          max-active: 8   #最大连接数据库连接数,设 0 为没有限制
@@ -122,8 +109,21 @@ spring:
          max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
          min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
        shutdown-timeout: 100ms
-     password: 'fenghaifu'
-     port: 14330
+     password: ''
+     port: 6379
+
+#  redis:
+#     database: 0
+#     host: 140.143.16.246
+#     lettuce:
+#       pool:
+#         max-active: 8   #最大连接数据库连接数,设 0 为没有限制
+#         max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
+#         max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
+#         min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
+#       shutdown-timeout: 100ms
+#     password: 'fenghaifu'
+#     port: 14330
 
 #mybatis plus 设置
 mybatis-plus:

+ 10 - 10
src/main/resources/application-test.yml

@@ -91,20 +91,20 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource: 
           master: 
-            url: jdbc:mysql://103.40.192.17:3306/cd_project_management?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false
+            url: jdbc:mysql://127.0.0.1:3306/cd_project_management?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
             username: root
-            password: CuiDian1234
+            password: root
             driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置   
-          #multi-datasource1: 
-            #url: jdbc:mysql://localhost:3306/jeecg-boot2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
-            #username: root
-            #password: root
-            #driver-class-name: com.mysql.jdbc.Driver
+          master2:
+            url: jdbc:mysql://127.0.0.1:3306/cd_project_management?characterEncoding=UTF-8&useUnicode=true&useSSL=false&allowMultiQueries=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
+            username: root
+            password: root
+            driver-class-name: com.mysql.jdbc.Driver
   #redis 配置
   redis:
      database: 0
-     host: 140.143.16.246
+     host: 127.0.0.1
      lettuce:
        pool:
          max-active: 8   #最大连接数据库连接数,设 0 为没有限制
@@ -112,8 +112,8 @@ spring:
          max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
          min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
        shutdown-timeout: 100ms
-     password: 'fenghaifu'
-     port: 14330
+     password: ''
+     port: 6379
 #mybatis plus 设置
 mybatis-plus:
    mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml

+ 1 - 1
src/main/resources/application.yml

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: test
+    active: prod
   devtools:
     restart:
       enabled: true

+ 3 - 3
src/main/resources/jeecg/jeecg_database.properties

@@ -1,9 +1,9 @@
 #mysql 
 diver_name=com.mysql.jdbc.Driver
-url=jdbc:mysql://103.40.192.17:3306/fangda_dev?useUnicode=true&characterEncoding=UTF-8
+url=jdbc:mysql://127.0.0.1:3306/cd_project_management?useUnicode=true&characterEncoding=UTF-8
 username=root
-password=CuiDian1234
-database_name=fangda_dev
+password=root
+database_name=cd_project_management
 
 #oracle
 #diver_name=oracle.jdbc.driver.OracleDriver