134 Commits
Author SHA1 Message Date
danshihao 1c5328b9cc [update 起草组] 批量审核 2024-09-11 10:54:07 +08:00
danshihao 91628f6d31 [update 委员会] 增加导出 2024-09-11 10:53:14 +08:00
fengchenchen bff0936e80 【fix:update】-收入分类统计 增加打包项目、打包子项目的统计维度 2024-08-21 16:07:14 +08:00
lijiarao 989539f500 update 打包查询未打包项目时回显工作组排序 2024-08-20 15:34:22 +08:00
fengchenchen 9d1e5bb25f Revert "【fix:bug】- 发布二次提醒是否发邮件,确认发送 和 不发送 换位置"
This reverts commit c76b7e40
2024-08-20 10:53:26 +08:00
fengchenchen c76b7e40e3 【fix:bug】- 发布二次提醒是否发邮件,确认发送 和 不发送 换位置 2024-08-20 10:38:22 +08:00
fengchenchen 1922dbd026 【fix:bug】-非打包项目,其他项目如果被打包,就除了打包列全部置灰== 删除该逻辑 2024-08-12 15:04:13 +08:00
fengchenchen ad861472dc 【fix:bug88316】- 缴费方式切换-查看凭证按钮显示的问题 2024-08-09 11:38:17 +08:00
fengchenchen 04adf4338d 【fix:bug88082】- 工作组-查看凭证去掉备注 2024-08-09 10:47:36 +08:00
fengchenchen a1bde7a838 【fix:bug88155】-标协会员 开票标识字段显示不对 2024-08-09 10:42:46 +08:00
fengchenchen 6a7e13774a 【update】-所有获取公钥的接口 在使用前获取 2024-08-08 11:43:32 +08:00
fengchenchen dd3cbcbd82 【fix:bug】- 用户新增、编辑上传时获取公钥 2024-08-08 11:27:49 +08:00
fengchenchen c839e1b89c 【update】- 工作组、起草组、功能安全中心-联系人最多20个 2024-08-07 15:37:31 +08:00
fengchenchen 8e2b42f82b 【update】-工作组列表增加排序列,打包项目列表页增加工作组的排序字段 2024-08-07 15:09:24 +08:00
fengchenchen bebebdffdf 【update】-会议增加查看凭证按钮 2024-08-07 14:57:43 +08:00
fengchenchen 3e998dc80c 【fix:bug88082】-工作组确认凭证修改成查看凭证 2024-08-06 20:38:08 +08:00
fengchenchen f4ca6b3611 【fix bug88067】-分标委维护--新增时不选择负责人B--编辑的时候placeholder消失 2024-08-06 20:27:15 +08:00
fengchenchen cced654401 Revert "【update】-修改-判断是否打包企业;企业管理注释掉 是否打包企业相关操作"
This reverts commit 3b32cf9b
2024-08-06 16:29:21 +08:00
fengchenchen 01cbf6b9ee 【fix:bug87980】-统计模块 增加是否打包查询条件 2024-08-02 16:58:11 +08:00
lijiarao 4381bdca90 update 全所收入统计 改为预估收入金额 2024-08-02 16:17:56 +08:00
fengchenchen 57df79c6f1 【fix:bug87963】-20240801 修改-缴费方式为 打包的时候也要待确收金额 2024-08-01 15:19:39 +08:00
fengchenchen 767299675b 【fix bug87902】-科室统计--导出文件名称修改 2024-07-31 19:12:35 +08:00
fengchenchen 339a29feb5 【FIX:BUG87909】-科室总体统计 -echartsX轴信息按照dom元素的宽度换行 2024-07-31 19:10:35 +08:00
fengchenchen 80721abca6 【FIX:BUG87909】-收入分类统计表头显示不下三点显示 2024-07-31 18:45:55 +08:00
fengchenchen c5b204f4d0 【fix:bug87654】-比对功能 将图例权限修改成实线 2024-07-31 18:10:23 +08:00
fengchenchen 804aeffb4a 【fix:bug87895】-企业来款分类统计--增加不选择来款企业默认查全部的功能 2024-07-31 15:49:38 +08:00
fengchenchen d20e10f6dc 【fix:bug87817】-收入分类统计-解决图例和饼状图文字重叠的问题 2024-07-30 19:40:58 +08:00
fengchenchen 468c7c3460 【fix:bug87654】-将图例权限修改成实线 2024-07-30 19:28:05 +08:00
fengchenchen b649c9706d 【fix:bug87706】-不需要发票的项目,开票按钮禁用(但开发备注这是24年2月份修改的需求) 2024-07-30 18:34:18 +08:00
fengchenchen 7afa2f18ca 【fix:bug87653】-年度数据锁定-修改删除方法 2024-07-29 17:13:17 +08:00
fengchenchen 394692d0c3 【fix:bug87641】-修改待确收金额 改成 修改 2024-07-29 16:01:11 +08:00
fengchenchen 0e9102a544 【update】-撤销 会议-编辑打包前金额 功能,会议打包统计确收年份修改成 项目年份 2024-07-25 18:05:03 +08:00
fengchenchen 3b32cf9be3 【update】-修改-判断是否打包企业;企业管理注释掉 是否打包企业相关操作 2024-07-25 15:42:33 +08:00
fengchenchen 1ebdfba46b 【update】-调试企业来款分类统计 2024-07-25 15:20:06 +08:00
fengchenchen 9484e4a058 Merge branch 'master' into 24年二季度其他 2024-07-25 10:01:13 +08:00
fengchenchen 9fc68a598a 【update】-企业来款分类统计-联调2 2024-07-19 20:05:55 +08:00
fengchenchen 23b9383c4f 【update】-企业来款分类统计 2024-07-19 19:21:09 +08:00
lijiarao f7f3059289 update 首页 科室总体统计 默认展示子项目 2024-07-18 15:05:10 +08:00
lijiarao e75fe6cc80 Merge branch 'master' into 24年二季度其他 2024-07-18 09:57:50 +08:00
lijiarao d69a53dec6 update 打包费用总计 2024-07-17 18:08:32 +08:00
fengchenchen 91f535fa29 【fix:bug87189】- 会议汇总-会议酒店推荐按钮 增加权限 2024-07-15 17:47:36 +08:00
fengchenchen 773372161c fix:bug87155:预估到账日期查询的样式,改成分段的,不是一次性选择 2024-07-15 16:56:28 +08:00
fengchenchen 38f7113cdc 【update】-科室总体统计-增加不同打包维度的筛选 2024-07-12 17:00:28 +08:00
fengchenchen 38063d2ae7 【update】-导入到标协会员 增加编码 2024-07-12 15:39:31 +08:00
sunzheng 7e646f0408 update:替换新增导入到标协会员接口地址 2024-07-12 14:36:22 +08:00
fengchenchen a6d2f71292 【update】-会员信息统计-基础样式导入 2024-07-11 16:06:33 +08:00
fengchenchen b715ae4b95 【update】会议酒店推荐-处理表格宽度 2024-07-11 15:30:08 +08:00
fengchenchen 12c69c1236 Merge branch 'master' into 24年二季度其他
# Conflicts:
#	src/enums/commonEnums.js
#	src/views/projectManagement/modules/PublishRemindModal.vue
2024-07-11 14:33:15 +08:00
fengchenchen 68450275e7 【update】-会议酒店推荐 修改会议类型为输入框,增加查看按钮 2024-07-11 14:12:13 +08:00
fengchenchen 884b39f7d8 【update】-联调、修改问题 2024-07-11 11:37:54 +08:00
sunzheng 37079c9f35 update:替换接口地址 2024-07-11 09:32:18 +08:00
danshihao 28a742fc4e [fix 86929] 设置资料状态报数据权限不足 2024-07-09 15:05:10 +08:00
danshihao 29c38e6c39 [fix 86993] 功能安全中心项目成员报名详情-只显示个人信息 2024-07-09 14:41:54 +08:00
danshihao 38b2194af0 [fix 86911] 功能安全中心项目会议-成员单位详情 2024-07-09 14:14:02 +08:00
danshihao 94767de37e [fix 86984] 功能安全中心项目会议-添加参会人只能选择本级成员 2024-07-09 14:01:51 +08:00
danshihao c43aa5c026 [fix 86965] 功能安全中心成员二级和三级不能新增联系人 2024-07-09 11:36:33 +08:00
danshihao 27ecc0e753 [fix 86976] 功能安全中心会议去掉审核查询 2024-07-09 10:35:49 +08:00
danshihao 95bd343b3d [fix 86964] 一级项目限制勾选删除 2024-07-08 20:03:28 +08:00
danshihao eb0df1c89f [fix 86931] 去掉不必要的字段 2024-07-08 19:58:02 +08:00
danshihao 87398e1cf4 [fix 86924] 分发资料-分发id改成取fileId 2024-07-08 19:36:19 +08:00
danshihao 6cb5058d27 [fix 86924] 分发资料-分发id改成取fileId 2024-07-08 19:24:28 +08:00
danshihao 8c05a04aa4 [fix 86929] 设置资料 2024-07-08 17:04:39 +08:00
danshihao 7b42c5b2d4 [fix 86911] 功能安全中心单位详情 2024-07-08 16:55:20 +08:00
danshihao db19e0c141 [fix 86907] 功能安全中心新增提示错误 2024-07-08 16:32:50 +08:00
danshihao c4ca153ff3 [fix 86926] 发布会议接口更改 2024-07-08 16:09:35 +08:00
danshihao 665aaf68ba [fix 86926] 发布会议接口更改 2024-07-08 16:03:31 +08:00
danshihao 423b529617 [update 功能安全中心会议] 会议发布 2024-07-05 15:37:15 +08:00
fengchenchen cbcdc87e2c 【update】-新增企业来款分类统计-待联调 2024-07-05 15:03:30 +08:00
danshihao 58295dbcfd [update 功能安全中心会议] 会议发布 2024-07-04 18:18:09 +08:00
danshihao c082b56756 [update 功能安全中心会议] 嘉宾上传文件 2024-07-04 17:37:58 +08:00
fengchenchen 001689e93d 【update】-新增年度数据锁定 2024-07-04 17:14:20 +08:00
fengchenchen 65da1fa6cd 【update】-删除测试表单 2024-07-04 16:13:44 +08:00
fengchenchen f011d3849b 【update】-会议酒店推荐 2024-07-04 15:19:50 +08:00
fengchenchen cb9688229f 【update】-理事会-新增导入到标协会员;工作组起草组-会议-文件上传可以批量上传 2024-07-04 14:33:43 +08:00
fengchenchen 5172d0ca42 【update】-会议打包统计-编辑打包前金额、会议列表页回显打包前金额到待确收金额字段 2024-07-04 13:34:48 +08:00
fengchenchen 241a860a97 【update】-工作组 去掉待确收金额相关数据 2024-07-04 10:27:33 +08:00
fengchenchen 7cb5e831d8 【update】-工作组和起草组会议列表页上方新增一个‘批量审核’按钮 2024-07-03 19:00:43 +08:00
fengchenchen 622e384104 【update】-工作组相关功能开发 2024-07-03 18:05:55 +08:00
danshihao 4b9747d188 [update 功能安全中心会议] 会议维护查询时带上安全中心项目id 2024-07-03 15:39:20 +08:00
danshihao f0e5bf9fb7 [update 功能安全中心会议] 完善会议成员接口 2024-07-03 15:31:56 +08:00
danshihao 333186220a [update 功能安全中心会议] 完善 2024-07-03 14:49:22 +08:00
danshihao 6e746ee8b7 Merge branch '24年6月海外会议' into 24年6月功能安全中心
# Conflicts:
#	src/enums/commonEnums.js
#	src/views/incomePayments/meetManage/AddOrDetailMeet.vue
#	src/views/incomePayments/meetManage/Attendance.vue
#	src/views/incomePayments/meetManage/SignUpInfoEdit.vue
#	src/views/incomePayments/meetManage/modules/UploadMeetFileModal.vue
#	src/views/projectManagement/AllMeetingList.vue
2024-07-03 10:44:48 +08:00
danshihao d0b10fcbfd [update 功能安全中心会议] 对接接口 2024-07-03 10:37:17 +08:00
danshihao d12ca7c8c1 [update 功能安全中心] 按钮权限 2024-07-02 19:20:03 +08:00
danshihao 53449cb843 [update 功能安全中心会议相关] 需要后续补充接口 2024-07-02 14:59:46 +08:00
fengchenchen e98ff8ddae 【update】-批量审核报名信息 2024-07-02 14:45:27 +08:00
danshihao caa5a4a27f [update 功能安全中心] 成员查询 2024-07-02 14:05:29 +08:00
danshihao 41f34428cc [update 功能安全中心] 成员只能添加父级已添加的成员 2024-07-02 12:22:02 +08:00
danshihao 6e720684ab [update 功能安全中心] 区分研究组项目组接口 2024-07-02 09:50:26 +08:00
danshihao 0664599927 [update 功能安全中心] 列表、成员单位部分接口对接 2024-07-01 18:14:52 +08:00
fengchenchen 93d3bf1abf 【update】-新增-会员信息统计列表 2024-07-01 17:54:35 +08:00
danshihao b1d1ecde9b [update 功能安全中心] 列表、成员单位部分接口对接 2024-07-01 17:42:56 +08:00
fengchenchen b06b9a8a67 【update】-普通项目-新增复制功能 2024-07-01 17:22:59 +08:00
fengchenchen d15bcd710b 【update】-预估到账日期修改为年月;查询条件统一由年月日修改为年月:普通项目、工作组详情、会员管理-详情 2024-06-28 19:52:40 +08:00
fengchenchen a76a945cc8 【update】-修改 待确收金额 2024-06-28 16:00:18 +08:00
danshihao 3e36bd9dab [update 海外会议] 调整字段顺序,单位职务拆两个字段 2024-06-27 11:11:56 +08:00
danshihao e065cf517d [fix 86409] 出生日期改为请选择 2024-06-26 14:50:37 +08:00
danshihao f85fa4427f [fix 菜单权限] 取消权限后重新登录还能访问已经没有权限的菜单 2024-06-26 14:12:35 +08:00
danshihao fc7bbaaffc [fix 86410] 海外会议去掉签到 2024-06-26 12:56:49 +08:00
danshihao ddb5f14674 [fix 86409] 出生日期改为请选择 2024-06-26 12:53:36 +08:00
danshihao a1a416dd86 [fix 86404] 海外会议-成员维护页面-去掉空白列 2024-06-26 12:45:17 +08:00
danshihao 9bddd48ef4 [fix 86399] 日期提示改为请选择 2024-06-26 11:45:57 +08:00
danshihao e943be1e5a [fix 86398] 去掉发布状态 2024-06-26 11:43:21 +08:00
danshihao 8b8c8a49da [update 海外会议] 参会人导出 2024-06-25 18:14:14 +08:00
danshihao 0a7a2cdb59 [update 海外会议] 校验邮箱格式 2024-06-25 17:10:50 +08:00
danshihao b8dc49e0d9 [update 海外会议] 限制上传图片格式 2024-06-25 16:52:25 +08:00
danshihao 1a1ca0e341 [update 海外会议] 去掉发布按钮 2024-06-25 14:51:11 +08:00
danshihao 1938867db2 [update 海外会议] 对接接口 2024-06-25 14:45:11 +08:00
danshihao 0f886b6df3 [add 海外会议] 添加参会人 2024-06-24 10:00:10 +08:00
danshihao 43388454db [add 海外会议] 基础页面 2024-06-19 16:35:34 +08:00
danshihao 36c4e412e9 Merge branch '24年6月17日国际研讨会' 2024-06-19 13:56:35 +08:00
danshihao 7ed658f9d8 [add 功能安全中心] 基础页面 2024-06-19 11:22:45 +08:00
danshihao 734675228e [update 国际研讨会] 新增编辑参会人职务信息字段完善 2024-06-18 14:22:31 +08:00
danshihao dd2554be80 [update 国际研讨会] 新增编辑参会人职务信息字段完善 2024-06-18 14:13:33 +08:00
danshihao 1f0e17bfdb [update 网络请求] wp29和iso接口挂了就不提示报错 2024-06-18 10:21:02 +08:00
danshihao 08bd176207 [update 国际研讨会] 会议会议联系人去掉五个限制,添加编辑参会人增加职务信息字段 2024-06-17 16:33:32 +08:00
danshihao 3aab024209 [update 委员会] 委员数量调整 2024-06-12 11:08:40 +08:00
danshihao 21fde02b1e [update 委员会] 委员数量位置调整 2024-06-12 09:33:47 +08:00
danshihao 7f5a13d05d [update 委员信息] 个人照片回显 2024-06-11 17:44:23 +08:00
danshihao ca068602d9 [update 委员信息] 上传个人照片 2024-06-07 15:49:15 +08:00
danshihao a2a0128561 [update 委员会] 按钮权限 2024-06-07 14:03:06 +08:00
danshihao 06c3505cc3 [add 委员会] 新增委员会信息、委员信息的列表页和详情页 2024-06-07 13:45:15 +08:00
danshihao eb5c3e77e0 [update 首页] 收入分类统计、应收账款图例增加滚动 2024-05-11 16:23:48 +08:00
danshihao fd37cb5de6 [update 首页] 收入分类统计、应收账款图例增加滚动 2024-05-11 16:10:49 +08:00
danshihao 37ea030b2f [update 起草组] 负责人A和负责人B权限统一 2024-05-11 11:52:39 +08:00
danshihao 05036be825 [update 首页] 收入分类统计颜色重复 2024-05-11 11:07:01 +08:00
danshihao a82cdc55e0 [update 起草组] 负责人A和负责人B权限统一 2024-05-11 11:00:45 +08:00
lijiarao 50b7bcf334 fix 合同关联会议项目 2024-04-19 12:03:01 +08:00
lijiarao f3f36f4ad2 update 首页收入分类统计增加打包 2024-04-16 12:17:26 +08:00
lijiarao 27f8b4366b update 首页收入分类统计增加打包 2024-04-16 12:00:02 +08:00
danshihao f32ca4e94a Merge branch '24年2月变更' 2024-04-03 14:36:02 +08:00
danshihao bae6e5ade4 Merge branch '24年2月变更' 2024-04-03 11:54:22 +08:00
lideqin 82bb7a2cbe [update] 到账开票-开票-发票附件字段改成非必填 2024-04-03 09:56:24 +08:00
fengchenchen a1623df600 【update】-人员信息调整顺序 2024-04-02 09:51:44 +08:00
100 changed files with 7264 additions and 389 deletions
+4 -1
View File
@@ -120,6 +120,8 @@ export const transitRESTful = {
const getContactsByCompany = (params) => getAction('/company/payContactsManagement/queryByCompany', params)
// 通过企业名称获取该企业下的联系人无权限接口
const getContactsByCompanyNoLimit = (params) => getAction('/company/payContactsManagement/queryByCompanyMeeting', params)
// 通过企业名称获取该企业下的联系人 功能安全中心接口只能看到父级的
const getContactsByCompanyBySafetyCenter = (params) => getAction('/company/payContactsManagement/queryBySafetyCenter', params)
// 通过联系人id获取联系人信息
const getContactsById = (param) => getAction('/company/payContactsManagement/queryByIdMeeting', param)
// 企业管理员重置密码
@@ -203,7 +205,8 @@ export {
ssLoginEnterTerminal,
companyAdminResetPassword,
companyAdminEnable,
queryCompanyInfoById
queryCompanyInfoById,
getContactsByCompanyBySafetyCenter
}
+4 -1
View File
@@ -32,6 +32,8 @@ const getStandardNumberList = (params) => getAction('/meeting/standardsMeeting/g
// 国际研讨会-WASIC-通过会议ID获取关联主题的信息
const getLinkTopics = (params) => getAction('/meeting/internalMeeting/getLinkTopics', params)
// 通过id获取海外会议参会人详细信息
const getSingUpUserInfoOverseas = (params) => getAction('/meeting/overseasSituation/queryById', params)
export {
getUserInfo,
@@ -46,5 +48,6 @@ export {
addGenerateCodeList,
editGenerateCodeList,
getStandardNumberList,
getLinkTopics
getLinkTopics,
getSingUpUserInfoOverseas
}
+10 -1
View File
@@ -170,6 +170,12 @@ const updatePackageEnterprise = (params) => postAction('/company/payCompanyManag
// 判断是否打包企业
const judgeCompanyIsPackaged = (params) => getAction('/company/payCompanyManagement/judgeCompanyIsPackaged', params)
// 2024年6月变更 功能安全中心
// 通过id获取功能安全中心详情
const getSafetyCenterById = (params) => getAction('/SafetyCenter/queryById', params)
// 功能安全中心会议的发布提醒
const safetyCenterPublishRemind = (param) => postAction('/meeting/safetyCenterMeeting/release', param)
export {
getWorkingGroupById,
getChargeNotice,
@@ -257,5 +263,8 @@ export {
workingGroupEditAccount,
getAllDraftProjects,
updatePackageEnterprise,
judgeCompanyIsPackaged
judgeCompanyIsPackaged,
getSafetyCenterById,
safetyCenterPublishRemind
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

+23 -8
View File
@@ -7,7 +7,7 @@
@cancel="handleCancel"
cancelText="关闭">
<!-- 基本信息begin-->
<section class="base-info" v-if="projectType !== ProjectTypeEnums.DRAFT_PRO.value">
<section class="base-info" v-if="hideCostInfo && !isSafetyCenterMeeting">
<h3 class="title">基本信息</h3>
<a-row :gutter="24">
<a-col :span="12" class="detail-item">
@@ -204,8 +204,8 @@
<!-- 企业联系人信息start-->
<section>
<h3 class="title">企业联系人信息</h3>
<!-- 项目类型不是工作组或起草组正常显示一个企业联系人的信息-->
<template v-if="![2, 7].includes(basicInfo.projectType)">
<!-- 项目类型不是工作组或起草组或功能安全中心正常显示一个企业联系人的信息-->
<template v-if="![2, 7, ProjectTypeEnums.SAFETY_CENTER_PRO.value].includes(basicInfo.projectType)">
<a-row :gutter="24">
<a-col :span="12">
<label>企业联系人</label>
@@ -243,8 +243,8 @@
</a-col>
</a-row>
</template>
<!-- 工作组项目或起草组项目使用循环显示出联系人信息-->
<template v-if="[2, 7].includes(basicInfo.projectType) && basicInfo.payWorkingGroupSubItemContactsList && basicInfo.payWorkingGroupSubItemContactsList.length > 0">
<!-- 工作组项目或起草组项目或功能安全中心使用循环显示出联系人信息-->
<template v-if="[2, 7, ProjectTypeEnums.SAFETY_CENTER_PRO.value].includes(basicInfo.projectType) && basicInfo.payWorkingGroupSubItemContactsList && basicInfo.payWorkingGroupSubItemContactsList.length > 0">
<div v-for="(item, index) in basicInfo.payWorkingGroupSubItemContactsList" :key="index + ''">
<a-row :gutter="24">
<a-col :span="12" class="detail-item">
@@ -292,7 +292,7 @@
</section>
<!-- 企业联系人信息end-->
<!--到账信息begin-->
<section class="payment-info" v-if="projectType !== ProjectTypeEnums.DRAFT_PRO.value">
<section class="payment-info" v-if="hideCostInfo && !isSafetyCenterMeeting">
<h3 class="title">到账信息</h3>
<div class="payment-info-box">
<section class="payment-info-title">到账信息</section>
@@ -306,7 +306,7 @@
</section>
<!--到账信息end-->
<!--开票邮寄信息begin-->
<section class="logistics-info" v-if="projectType !== ProjectTypeEnums.DRAFT_PRO.value">
<section class="logistics-info" v-if="hideCostInfo && !isSafetyCenterMeeting">
<h3 class="title">开票邮寄信息</h3>
<div class="wrap-table">
<a-table
@@ -341,7 +341,7 @@
import { queryCommonProjectById, getStanderMemberLastProofInfo, getCertificateLastProofInfo } from '@api/incomePaymentsApi'
import JEllipsis from '@comp/jero/JEllipsis'
import PreviewFile from './jero/PreviewFile'
import { ProjectTypeEnums } from '@/enums/commonEnums'
import {MeetingTypeEnums, ProjectTypeEnums} from '@/enums/commonEnums'
import Vue from 'vue'
import {ACCESS_TOKEN} from '@/store/mutation-types'
import PreviewFileModal from '@comp/PreviewFileModal'
@@ -414,6 +414,11 @@ export default {
projectType:{
type: Number,
required: false
},
// 会议类型
meetingType: {
type: String,
required: false
}
},
data() {
@@ -441,6 +446,16 @@ export default {
}
},
computed: {
// 是否隐藏金额相关信息(起草组、功能安全中心)
hideCostInfo () {
const arr = [ProjectTypeEnums.DRAFT_PRO.value, ProjectTypeEnums.SAFETY_CENTER_PRO.value]
return !arr.includes(this.projectType)
},
// 是否功能安全中心会议
isSafetyCenterMeeting () {
console.log(this.meetingType)
return this.meetingType + '' === MeetingTypeEnums.safetyCenter.value
},
// 是否是第三方代付
hasOtherCompany() {
// 去掉未审核 去判断的企业是否是标协会企业
+39 -2
View File
@@ -77,6 +77,18 @@ export default {
type:Boolean,
required:false,
default:false
},
// 自定义列表接口(功能安全中心只能看到父级已添加的企业)
customListUrl: {
type: String,
required: false,
default: ''
},
// 自定义列表查询参数,功能安全中心会议
customListParams: {
type: Object,
required: false,
default: () => ({})
}
},
data() {
@@ -133,7 +145,16 @@ export default {
params.memberNature = this.memberNature
}
this.loading = true
getAction(this.url.list, params).then((res) => {
let url = this.url.list
// 如果有自定义的查询列表接口,就用自定义的查询以及查询参数
if (this.customListUrl) {
url = this.customListUrl
}
// 如果有自定义查询参数,就将参数合并进去
if (this.customListParams) {
Object.assign(params, this.customListParams)
}
getAction(url, params).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------
this.dataSource = res.result.records || res.result
@@ -180,7 +201,23 @@ export default {
resultArr.push(row)
}
})
this.selectedCompany = [...this.selectedCompany, ...resultArr]
// 2024-07-25 当前页没有选择的数据
let unSelectedCompany = []
this.dataSource.map(tt => {
if(!selectedRowKeys.includes(tt.id)) {
unSelectedCompany.push(tt)
}
})
// 获取之前选择的 非本页的标准信息
let lastSelectedCompany = []
this.selectedCompany.forEach(row => {
let ele = unSelectedCompany.find(ele => ele.id === row.id)
if(!ele) {
lastSelectedCompany.push(row)
}
})
this.selectedCompany = [...lastSelectedCompany, ...resultArr]
// this.selectedCompany = selectionRows
}
this.selectedRowKeys = selectedRowKeys
-1
View File
@@ -94,7 +94,6 @@ export default {
* @param value
*/
handleOk(value) {
console.log('--------value---------', value)
let company = {id: undefined, companyName: undefined}
// 多选的时候 全部放在一起,以逗号分隔
if (this.isMultiple) {
+36 -2
View File
@@ -2,7 +2,7 @@
<!-- 在点击组件时获取联系人列表-->
<div>
<a-row>
<a-col :span="20">
<a-col :span="canAdd ? 20 : 24">
<a-select :value="value"
v-bind="$attrs"
v-on="$listeners"
@@ -14,7 +14,7 @@
<a-select-option v-for="item in contactsList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
</a-select>
</a-col>
<a-col :span="4" class="form-btn">
<a-col :span="4" class="form-btn" v-if="canAdd">
<a-button icon="plus" v-bind="$attrs" @click="addContacts"></a-button>
</a-col>
</a-row>
@@ -50,6 +50,12 @@ export default {
return {}
}
},
// 是否可以新增:true--可以;false--不可以
canAdd: {
type: Boolean,
required: false,
default: true
},
value: {
type: [String, Object],
required: false,
@@ -72,6 +78,18 @@ export default {
type: Boolean,
required: false,
default: false
},
// 自定义列表接口(功能安全中心只能看到父级已添加的企业)
customListFn: {
type: [Function, null],
required: false,
default: null
},
// 自定义列表查询参数,功能安全中心会议
customListParams: {
type: Object,
required: false,
default: () => ({})
}
},
data() {
@@ -126,6 +144,22 @@ export default {
} else {
params.companyId = null
}
// 如果有自定义查询参数,就将参数合并进去
if (this.customListParams) {
Object.assign(params, this.customListParams)
}
// 如果有自定义查询接口,就用自定义的
if (this.customListFn) {
return new Promise(resolve => {
this.customListFn(params).then(res => {
this.contactsList = res.result
if (this.initContacts && this.initContacts.id) {
this.contactsList.push(this.initContacts)
}
resolve()
})
})
}
// 是否调用无权限接口
if (this.isLimit) {
// 调用无权限接口
+7 -3
View File
@@ -1,8 +1,8 @@
@font-face {
font-family: "anticon-jeecg"; /* Project id 2798517 */
src: url('iconfont.woff2?t=1705570227820') format('woff2'),
url('iconfont.woff?t=1705570227820') format('woff'),
url('iconfont.ttf?t=1705570227820') format('truetype');
src: url('iconfont.woff2?t=1717644876199') format('woff2'),
url('iconfont.woff?t=1717644876199') format('woff'),
url('iconfont.ttf?t=1717644876199') format('truetype');
}
.anticon-jeecg {
@@ -13,6 +13,10 @@
-moz-osx-font-smoothing: grayscale;
}
.anticonyinzhang:before {
content: "\e785";
}
.anticondraftgroup:before {
content: "\e65e";
}
File diff suppressed because one or more lines are too long
+7
View File
@@ -5,6 +5,13 @@
"css_prefix_text": "anticon",
"description": "",
"glyphs": [
{
"icon_id": "39837879",
"name": "cus_tc",
"font_class": "yinzhang",
"unicode": "e785",
"unicode_decimal": 59269
},
{
"icon_id": "3009589",
"name": "cus_draftgroup",
Binary file not shown.
Binary file not shown.
Binary file not shown.
+16 -1
View File
@@ -89,8 +89,14 @@
type:Number,
required:false,
default:0
}
},
//update-end-author:wangshuai date:20201021 for:LOWCOD-969 新增number属性,用于判断上传数量
// 限制的后缀数组
fileTypeList: {
type: Array,
required: false,
default: () => []
}
},
computed: {
//透传给下级组件的事件,需要排除本组件使用的change事件
@@ -190,6 +196,15 @@
this.$message.warning('请上传图片')
return false
}
// 限制文件类型
if (this.fileTypeList && this.fileTypeList.length) {
const tmpArr = file.name.split('.')
const fileSuffix = tmpArr[tmpArr.length - 1].toLowerCase()
if (!this.fileTypeList.some(t => t === fileSuffix)) {
this.$message.warning('图片格式必须是' + this.fileTypeList.join(','))
return false
}
}
},
handleChange(info) {
this.picUrl = false
+2 -2
View File
@@ -316,8 +316,8 @@ export default {
file.uploadGoOn = true
const fileSize = file.size // 上传的文件大小
const fileType = file.type // 上传的文件类型
if (fileSize > 1024 * 1024 * 100) {
this.$message.warning('文件大小限制为100M')
if (fileSize > 1024 * 1024 * 200) {
this.$message.warning('文件大小限制为200M')
this.uploadGoOn = false
file.uploadGoOn = false
return false
+100
View File
@@ -0,0 +1,100 @@
<template>
<a-month-picker
:disabledDate="disabledDate"
:disabled="disabled || readOnly"
:placeholder="placeholder"
@change="handleDateChange"
:value="momVal"
:showTime="showTime"
:format="dateFormat"
:mode="mode"
:getCalendarContainer="getCalendarContainer"
/>
</template>
<script>
import moment from 'moment'
export default {
name: 'JMonthDate',
props: {
placeholder: {
type: String,
default: '',
required: false
},
value: {
type: String,
required: false
},
disabledDate: {
type: Function
},
dateFormat: {
type: String,
default: 'YYYY-MM-DD',
required: false
},
// 此属性可以被废弃了
triggerChange: {
type: Boolean,
required: false,
default: false
},
readOnly: {
type: Boolean,
required: false,
default: false
},
disabled: {
type: Boolean,
required: false,
default: false
},
showTime: {
type: Boolean,
required: false,
default: false
},
getCalendarContainer: {
type: Function,
default: (node) => node.parentNode
},
mode: {
type: String,
required: false,
default: 'date'
}
},
data() {
const dateStr = this.value
return {
decorator: '',
momVal: !dateStr ? null : moment(dateStr, this.dateFormat)
}
},
watch: {
value(val) {
if (!val) {
this.momVal = null
} else {
this.momVal = moment(val, this.dateFormat)
}
}
},
methods: {
moment,
handleDateChange(mom, dateStr) {
this.$emit('change', dateStr)
}
},
// 2.2新增 在组件内定义 指定父组件调用时候的传值属性和事件类型 这个牛逼
model: {
prop: 'value',
event: 'change'
}
}
</script>
<style lang="less" scoped>
/deep/ .ant-input {
padding: 4px 6px;
}
</style>
+10 -4
View File
@@ -82,6 +82,12 @@ export default {
type: Boolean,
required: false,
default: false
},
// 是否需要发票字段的KEY值,目前只有标协会员使用了,发票使用的。
invoiceKey: {
type: String,
required: false,
default: 'needInvoice'
}
},
computed: {
@@ -89,9 +95,9 @@ export default {
status() {
// 非打包项目,其他项目如果被打包,就除了打包列全部置灰
// 如果有打包字段 && 当前列不是打包列 && 当前行是打包为"是" && 当前项目不是打包项目
if (this.packField && this.statusKey !== 'pack' && this.statuObj[this.packField] === 1 && this.statuObj.projectType !== ProjectTypeEnums.PACK_PRO.value) {
return zero
}
// if (this.packField && this.statusKey !== 'pack' && this.statuObj[this.packField] === 1 && this.statuObj.projectType !== ProjectTypeEnums.PACK_PRO.value) {
// return zero
// }
if (this.statuObj.amountReceivable === '0.00' || this.statuObj.receivableAmount === '0.00') {
if (this.statusType) {
// 待确收金额为0 未到账 未邮寄 未开票的状态
@@ -110,7 +116,7 @@ export default {
// 待确收金额不为0 都正常判断
if (this.statusNo === 0) {
// 开票或邮寄时,不需要发票
if ((this.statusKey === 'bill' || this.statusKey === 'mail') && this.statuObj.needInvoice === 0) {
if ((this.statusKey === 'bill' || this.statusKey === 'mail') && this.statuObj[this.invoiceKey] === 0) {
return zero
} else {
return error
@@ -83,7 +83,6 @@ export default {
id: uId,
email: uEmail
}
this.getPublicKey()
let timer = setTimeout(() => {
this.form.setFieldsValue({ email: this.model.email })
clearTimeout(timer)
@@ -93,17 +92,22 @@ export default {
}
},
getPublicKey() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
this.form.validateFields(async (err, values) => {
if (!err) {
that.confirmLoading = true
let params = Object.assign(this.model, values)
await this.getPublicKey()
params.emailPassword = encrypt(this.rsaPublicKey, values.emailPassword)
params.rsaPublicKey = this.rsaPublicKey
console.log('修改授权码提交数据', params)
+2 -1
View File
@@ -166,7 +166,8 @@ export default {
// update-begin author:wangshuai date:20200601 for: 退出登录跳转登录页面
that.$router.push({ path: '/user/login' })
// update-end author:wangshuai date:20200601 for: 退出登录跳转登录页面
//window.location.reload()
// 退出登录必须要刷新页面,否则会保留上一个用户的菜单权限
window.location.reload()
}).catch(err => {
that.$message.error({
title: '错误',
+8 -4
View File
@@ -125,14 +125,17 @@ export default {
return
} else {
this.username = uname
this.getPublicKey()
this.form.resetFields()
this.visible = true
}
},
getPublicKey() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
handleCancel() {
@@ -147,9 +150,10 @@ export default {
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
this.form.validateFields(async (err, values) => {
if (!err) {
that.confirmLoading = true
await this.getPublicKey()
let params = {}
params.username = this.username
params.rsaPublicKey = this.rsaPublicKey
+28 -1
View File
@@ -8,7 +8,8 @@ export const ProjectTypeEnums = {
STANDARD_MEMBER_PRO: {name: '标协会员项目', value: 5},
STANDARD_CERTIFICATE_PRO: {name: '标协证书项目', value: 6},
DRAFT_PRO: {name: '起草组项目', value: 7},
PACK_PRO: { name: '打包项目', value: 8 }
PACK_PRO: { name: '打包项目', value: 8 },
SAFETY_CENTER_PRO: { name: '功能安全中心项目', value: 9 }
}
// 参会人员身份类型
@@ -62,4 +63,30 @@ export const PayMode = {
remittance: { name: '汇款', value: 1 },
onSitePayment: { name: '现场缴费', value: 2 },
pack: { name: '打包', value: 3 },
}
// 会议类型
export const MeetingTypeEnums = {
workGroup: { name: '工作组会议', value: '1' },
standard: { name: '标协会议', value: '2' },
internationalSeminar: { name: '国际研讨会', value: '3' },
other: { name: '其他会议', value: '4' },
committee: { name: '分标委会议', value: '5' },
council: { name: '理事会会议', value: '6' },
draftGroup: { name: '起草会会议', value: '7' },
overseas: { name: '海外会议', value: '8' },
safetyCenter: { name: '功能安全中心会议', value: '9' }
}
// 功能安全中心-项目类型
export const SafetyCenterProjectTypeEnums = {
safetyCenter: { name: '功能安全中心', value: '1' },
studyGroup: { name: '研究组', value: '2' },
projectGroup: { name: '项目组', value: '3' }
}
export const OpeTypeEnums = {
add: { name: '新增', value: 1 },
copy: { name: '复制', value: 2 },
edit: { name: '编辑', value: 3 }
}
+9 -3
View File
@@ -4,7 +4,7 @@
* data中url定义 list为查询列表 delete为删除单条记录 deleteBatch为批量删除
*/
import {filterObj} from '@/utils/util'
import {getAction, downloadFile, getFileAccessHttpUrl, postAction} from '@/api/manage'
import {getAction, downloadFile, getFileAccessHttpUrl, postAction, httpAction} from '@/api/manage'
import Vue from 'vue'
import {ACCESS_TOKEN, TENANT_ID} from '@/store/mutation-types'
import store from '@/store'
@@ -58,6 +58,8 @@ export const JeroListMixin = {
superQueryParams: '',
/** 高级查询拼接方式 */
superQueryMatchType: 'and',
// 新增的删除接口请求方式改成post,需要的模块设置成true
postMethodDel: false
}
},
created() {
@@ -193,7 +195,9 @@ export const JeroListMixin = {
content: '是否删除选中数据?',
onOk: function () {
that.loading = true
getAction(that.url.deleteBatch, {ids: ids}).then((res) => {
// 新增加的删除接口用post方式请求
const actionFunc = that.postMethodDel ? postAction : getAction
actionFunc(that.url.deleteBatch, {ids: ids}).then((res) => {
if (res.success) {
that.$message.success(res.message)
// 判断当前删除的数据是否是最后一页的全部数据,如果是的话页码减一
@@ -228,7 +232,9 @@ export const JeroListMixin = {
title: '确认删除',
content: '确定要删除此条数据吗?',
onOk: function () {
getAction(that.url.delete, {id: id}).then((res) => {
// 新增加的删除接口用post方式请求
const actionFunc = that.postMethodDel ? postAction : getAction
actionFunc(that.url.delete, {id: id}).then((res) => {
if (res.success) {
that.$message.success(res.message)
// 判断当前删除的数据是否是最后一页的最后一条数据,如果是的话页码减一
+58
View File
@@ -0,0 +1,58 @@
/**
* @description 预期到账金额 修改成 年月的形式。
* @author fcc
* */
import moment from 'moment'
export const MonthRangeMixin = {
data() {
return {
rangeMonthDateFormat: 'YYYY-MM',
rangeMonthDateModel: ['month', 'month'],
rangeMonthKey:{
start: 'estimatedArrivalStartDate',
end: 'estimatedArrivalEndDate',
}
}
},
methods:{
moment,
// onMonthRangeDateChange(value, dateString) {
// this.queryParam[this.rangeMonthKey.start] = dateString[0] || null
// this.queryParam[this.rangeMonthKey.end] = dateString[1] || null
// this.queryParam.estimatedArrivalDate = value
// },
// handleMonthRangePanelChange(value, mode) {
// this.queryParam[this.rangeMonthKey.start] = !value[0] ? null : value[0].format(this.rangeMonthDateFormat)
// this.queryParam[this.rangeMonthKey.end] = !value[1] ? null : value[1].format(this.rangeMonthDateFormat)
// this.queryParam.estimatedArrivalDate = value
// this.rangeMonthDateModel = [mode[0] === 'date' ? 'month' : mode[0], mode[1] === 'date' ? 'month' : mode[1]]
// },
// // 重写查询方法--删除预估到账日期属性
// searchQuery() {
// this.lastQueryParam = {...this.queryParam}
// if(this.lastQueryParam.estimatedArrivalDate) {
// delete this.lastQueryParam.estimatedArrivalDate
// }
// this.loadData(1)
// },
disabledStartMonth(startValue) {
const endValue = this.queryParam[this.rangeMonthKey.end] && moment(this.queryParam[this.rangeMonthKey.end], this.rangeMonthDateFormat)
if (!startValue || !endValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
disabledEndMonth(endValue) {
const startValue = this.queryParam[this.rangeMonthKey.start] && moment(this.queryParam[this.rangeMonthKey.start], this.rangeMonthDateFormat)
if (!endValue || !startValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
disabledDateBeforeToday(current) {
return current < moment().subtract(1, 'day') // 当天之前的不可选,不包括当天
}
}
}
+8 -2
View File
@@ -20,6 +20,12 @@ const err = (error) => {
const token = Vue.ls.get(ACCESS_TOKEN)
// console.log('------异常响应------', token)
// console.log('------异常响应------', error.response.status)
// 如果ISO和WP29挂了,就不提示
let tipFlag = true
if(error.config.url.indexOf('/WPApi') === 0 || error.config.url.indexOf('/ISO') === 0) {
tipFlag = false
}
switch (error.response.status) {
case 403:
notification.error({ message: '系统提示', description: '拒绝访问', duration: 4 })
@@ -60,7 +66,7 @@ const err = (error) => {
}
break
case 404:
notification.error({ message: '系统提示', description: '很抱歉,资源未找到!', duration: 4 })
tipFlag && notification.error({ message: '系统提示', description: '很抱歉,资源未找到!', duration: 4 })
break
case 504:
notification.error({ message: '系统提示', description: '网络超时' })
@@ -76,7 +82,7 @@ const err = (error) => {
}
break
default:
notification.error({
tipFlag && notification.error({
message: '系统提示',
description: data.message,
duration: 4
@@ -120,44 +120,44 @@ export default {
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}, {
title: '企业名称',
align: 'center',
width: 300,
dataIndex: 'companyName',
scopedSlots: { customRender: 'text' }
}, {
title: '姓名',
align: 'center',
width: 280,
width: 300,
dataIndex: 'name',
scopedSlots: { customRender: 'text' }
}, {
title: '性别',
align: 'center',
width: 80,
width: 100,
dataIndex: 'gender_dictText'
}, {
title: '职务',
align: 'center',
width: 280,
width: 300,
dataIndex: 'post',
scopedSlots: { customRender: 'text' }
}, {
title: '手机号',
align: 'center',
width: 140,
width: 175,
dataIndex: 'phone'
},{
title: '角色',
align: 'center',
width: 140,
width: 175,
dataIndex: 'roleCode_dictText'
}, {
title: '创建时间',
align: 'center',
width: 150,
dataIndex: 'createTime'
}, {
title: '企业名称',
align: 'center',
width: 280,
dataIndex: 'companyName',
scopedSlots: { customRender: 'text' }
// }, {
// title: '创建时间',
// align: 'center',
// width: 150,
// dataIndex: 'createTime'
}, {
title: '操作',
dataIndex: 'action',
@@ -122,7 +122,6 @@ export default {
},
edit(record) {
this.form.resetFields()
this.getRSAPublicKeyFunc()
this.model = Object.assign({}, record)
// 回显企业
this.model.companyId = {
@@ -148,8 +147,15 @@ export default {
* 获取公钥
* */
getRSAPublicKeyFunc() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
// getRSAPublicKey().then(res => {
// this.rsaPublicKey = res.result
// })
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
close() {
@@ -164,7 +170,7 @@ export default {
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
this.form.validateFields(async (err, values) => {
if (!err) {
let httpurl = ''
let method = 'post'
@@ -173,6 +179,7 @@ export default {
} else {
httpurl += this.url.edit
}
await this.getRSAPublicKeyFunc()
const formData = Object.assign(this.model, values)
formData.companyName = this.selectedCompany.companyName
formData.companyId = this.selectedCompany.id
@@ -305,7 +305,7 @@
:signed-contact-id="signedContactId"
:default-charge-company="selectedCompany"></select-working-group-project-module>
<!-- 会议项目选择-->
<select-meeting-project-module ref="selectMeetingProjectModule"
<select-meeting-project-module ref="selectMeetingProjectModule" :project-type="projectType"
@ok="selectProjectOk"></select-meeting-project-module>
<!-- 会员项目选择-->
@@ -112,6 +112,14 @@ import '@/assets/less/TableExpand.less'
export default {
name: 'SelectMeetingProjectModule',
mixins: [JeroListMixin],
props: {
// 项目类型,1--普通项目;2--工作组项目;3--会议项目;4--会员项目
projectType: {
type: Number,
requird: false,
default: null
}
},
components: {
JDate,
JYearDate,
@@ -310,6 +318,7 @@ export default {
let submitData = []
let projectItem
console.log(this.selectionRows)
this.selectedRowKeys.forEach(item => {
projectItem = {
contractId: this.contractId,
+63 -2
View File
@@ -5,6 +5,13 @@
科室总体统计
<j-year-date style="width:250px" class="year" placeholder="请选择年份" v-model="queryParam.year" @change="loadData"></j-year-date>
</div>
<div class="operator">
<span @click="toggleEcharts('packProject')" class="operator-left"
:class="{'active':activeIndex === 'packProject'}">打包项目</span>
<span @click="toggleEcharts('childProject')" class="operator-right"
:class="{'active':activeIndex === 'childProject'}">子项目</span>
</div>
<div class="echarts-box" id="departmentTotal"></div>
<!-- 表格区域beign -->
@@ -88,6 +95,7 @@ export default {
mixins: [JeroListMixin],
data() {
return {
activeIndex: 'childProject',
disableMixinCreated: true,
url: {
list: '/index/overallDepartmentStatistics',
@@ -104,6 +112,15 @@ export default {
this.loadData(1)
},
methods: {
toggleEcharts(key) {
if (key === this.activeIndex) {
return
} else {
this.activeIndex = key
this.loadData()
this.$forceUpdate()
}
},
formatMoney,
loadData(arg) {
if (!this.url.list) {
@@ -114,8 +131,12 @@ export default {
if (arg === 1) {
this.ipagination.current = 1
}
let typeEnum = {
packProject: 1,
childProject: 2
}
let params = this.getQueryParams()//查询条件
params = Object.assign({}, params, {year: this.queryParam.year})
params = Object.assign({}, params, {type: typeEnum[this.activeIndex], year: this.queryParam.year})
this.loading = true
getAction(this.url.list, params).then((res) => {
if (res.success) {
@@ -188,6 +209,11 @@ export default {
let chartDom = document.getElementById('departmentTotal')
let myChart = echarts.init(chartDom)
let option
let provideNumber = 8
if(chartDom) {
const chartDomWidth = chartDom.offsetWidth
provideNumber = Math.floor(chartDomWidth / 200)
}
option = {
color: ['#069F99', '#FFA17A'],
@@ -234,7 +260,7 @@ export default {
formatter: function (params) {
let newParamsName = '' // 最终拼接成的字符串
let paramsNameNumber = params.length // 实际标签的个数
let provideNumber = 8 // 每行能显示的字的个数
// let provideNumber = provideNumber // 每行能显示的字的个数
let rowNumber = Math.ceil(paramsNameNumber / provideNumber) // 换行的话,需要显示几行,向上取整
/**
* 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
@@ -334,6 +360,7 @@ export default {
padding: 20px;
box-sizing: border-box;
width: 100%;
position: relative;
//height: auto;
}
@@ -368,4 +395,38 @@ export default {
background: rgb(245, 245, 246);
}
.operator {
color: #069F99;
position: absolute;
user-select: none;
display: flex;
font-size: 12px;
justify-content: space-around;
align-items: center;
right: 20px;
top: 10px;
width: 180px;
height: 32px;
line-height: 32px;
border: 1px solid #069F99;
border-radius: 4px;
cursor: pointer;
&-left {
width: 50%;
text-align: center;
border-right: 1px solid #069F99;
}
&-right {
width: 50%;
text-align: center;
}
}
.active {
background: #069F99;
color: #fff;
}
</style>
+78 -35
View File
@@ -1,30 +1,39 @@
<!-- 分类统计-->
<template>
<div class="container">
<div class="title">收入分类统计
<a-tree-select
:multiple="false"
show-search
:replaceFields="{value:'orgCode'}"
allowClear
tree-default-expand-all
tree-node-filter-prop="title"
@change="changeDepart"
style="width:20%"
:dropdownStyle="{ maxHeight: '200px',maxWidth:'100px','overflow-x':'hidden',' overflo-y': 'auto' }"
:treeData="treeDepartData"
v-model="queryParam.departCode"
placeholder="请选择部门">
</a-tree-select>
<j-year-date style="width:20%" class="year" placeholder="请选择年份" v-model="queryParam.year" @change="loadData"></j-year-date>
</div>
<div class="title">收入分类统计</div>
<div class="operator">
<span @click="projectToggleEcharts('packProject')" class="operator-left"
:class="{'active':projectActiveIndex === 'packProject'}">打包项目</span>
<span @click="projectToggleEcharts('childProject')" class="operator-right"
:class="{'active':projectActiveIndex === 'childProject'}">子项目</span>
</div>
<div class="search-class">
<div class="title">
<a-tree-select
:multiple="false"
show-search
:replaceFields="{value:'orgCode'}"
allowClear
tree-default-expand-all
tree-node-filter-prop="title"
@change="changeDepart"
style="width:20%"
:dropdownStyle="{ maxHeight: '200px',maxWidth:'100px','overflow-x':'hidden',' overflo-y': 'auto' }"
:treeData="treeDepartData"
v-model="queryParam.departCode"
placeholder="请选择部门">
</a-tree-select>
<j-year-date style="width:20%" class="year" placeholder="请选择年份" v-model="queryParam.year" @change="loadData"></j-year-date>
</div>
<div class="operator sub-operator">
<span @click="toggleEcharts('income')" class="operator-left"
:class="{'active':activeIndex === 'income'}">收入分析</span>
<span @click="toggleEcharts('allMoney')" class="operator-left"
:class="{'active':activeIndex === 'allMoney'}">应收</span>
<span @click="toggleEcharts('confirmAmount')" class="operator-right"
:class="{'active':activeIndex === 'confirmAmount'}">确收</span>
<span @click="toggleEcharts('allMoney')" class="operator-left"
:class="{'active':activeIndex === 'allMoney'}">应收</span>
<span @click="toggleEcharts('confirmAmount')" class="operator-right"
:class="{'active':activeIndex === 'confirmAmount'}">确收</span>
</div>
</div>
<div class="echarts-box" id="incomeSort"></div>
<!-- 表格区域beign -->
@@ -46,6 +55,12 @@
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<span v-for="item in columns" :slot="item.dataIndex" :key="item.dataIndex">
<a-tooltip>
<template slot="title">{{ item[item.dataIndex] }}</template>
<div class="table-text">{{ item[item.dataIndex] }}</div>
</a-tooltip>
</span>
<template slot="allMoney" slot-scope="text">
<a-tooltip>
@@ -102,6 +117,7 @@ export default {
data() {
return {
activeIndex: 'income',
projectActiveIndex: 'childProject', // 打包项目、打包子项目选中的索引
echartsInstace: null,
columns,
url: {
@@ -118,6 +134,15 @@ export default {
},
methods: {
formatMoney,
projectToggleEcharts(key) {
if (key === this.projectActiveIndex) {
return
} else {
this.projectActiveIndex = key
this.loadData()
this.$forceUpdate()
}
},
toggleEcharts(key) {
if (key === this.activeIndex) {
return
@@ -163,7 +188,11 @@ export default {
confirmAmount: 2,
income: 3
}
getAction(this.url.list, {type: typeEnum[this.activeIndex],departCode:this.queryParam.departCode,year:this.queryParam.year}).then(res => {
const projectTypeEnum = {
packProject: 1,
childProject: 2
}
getAction(this.url.list, {type: typeEnum[this.activeIndex], projectType: projectTypeEnum[this.projectActiveIndex], departCode:this.queryParam.departCode,year:this.queryParam.year}).then(res => {
if (res.success) {
let dataSource = res.result
this.initColumns(res.result)
@@ -177,7 +206,7 @@ export default {
let dataIndex = 'key' + index
tableData[0][dataIndex] = item.money
// tableData[1][dataIndex] = item.value ? item.value +'%' :''
if(index !== 5){
if(index !== 6){
tableData[1][dataIndex] = item.value ? item.value + '%' :''
}else {
tableData[1][dataIndex] = '100%'
@@ -188,7 +217,7 @@ export default {
})
},
initEcharts(data) {
let color = ['#069F99', '#88C87E ', '#6D7FD0', '#FA9D81', '#A5B3FF']
let color = ['#069F99', '#88C87E', '#6D7FD0', '#FA9D81', '#A5B3FF', '#519FD1', '#55433B', '#9ABECA']
let echartsData = data.reduce((pre, val) => {
return pre.concat({value: val.value, name: val.name_dictText, money: val.money})
}, [])
@@ -213,8 +242,8 @@ export default {
legend: {
bottom: '2%',
right: '2%',
padding: [0,70, 0, 70],
itemGap:40 // 图例之间的间距
padding: [0, 70, 10, 70],
itemGap: 20 // 图例之间的间距
},
labelLine: {
lineStyle: {
@@ -260,7 +289,7 @@ export default {
* 处理表头
* */
initColumns(data) {
const newData = data.slice(0,5)
const newData = data.slice(0,6)
this.columns = [
{
title: '',
@@ -272,7 +301,9 @@ export default {
]
newData.map((item, index) => {
this.columns.push({
title: item.name_dictText,
// title: item.name_dictText,
slots:{title: 'key' + index},
['key' + index]:item.name_dictText,
align: 'center',
width: 80,
dataIndex: 'key' + index,
@@ -283,7 +314,7 @@ export default {
title: '总数',
align: 'center',
width: 70,
dataIndex: 'key5',
dataIndex: 'key6',
scopedSlots: {customRender: 'allMoney'}
},)
},
@@ -347,24 +378,36 @@ export default {
right: 20px;
top: 20px;
width: 180px;
height: 35px;
line-height: 35px;
height: 32px;
line-height: 32px;
border: 1px solid #069F99;
border-radius: 4px;
cursor: pointer;
&-left {
width: 33.3%;
width: 50%;
text-align: center;
border-right: 1px solid #069F99;
}
&-right {
width: 33.3%;
width: 50%;
text-align: center;
}
}
.search-class {
position: relative;
padding-top: 21px;
}
.sub-operator.operator {
right: 0;
.operator-left {
width: 33.3%;
}
.operator-right {
width: 33.4%;
}
}
.active {
background: #069F99;
color: #fff;
@@ -373,7 +416,7 @@ export default {
.echarts-box {
min-width: 300px;
width: 100%;
height: 400px;
height: 440px;
}
.point {
+11 -14
View File
@@ -1,7 +1,8 @@
<!-- 未收账款统计-->
<template>
<div class="container">
<div class="title">应收账款
<div class="title">应收账款</div>
<div class="search-class">
<a-tree-select
:multiple="false"
show-search
@@ -17,14 +18,6 @@
placeholder="请选择部门">
</a-tree-select>
</div>
<!-- <div class="operator">-->
<!-- <span @click="toggleEcharts('income')" class="operator-left"-->
<!-- :class="{'active':activeIndex === 'income'}">收入分析</span>-->
<!-- <span @click="toggleEcharts('allMoney')" class="operator-left"-->
<!-- :class="{'active':activeIndex === 'allMoney'}">应收</span>-->
<!-- <span @click="toggleEcharts('confirmAmount')" class="operator-right"-->
<!-- :class="{'active':activeIndex === 'confirmAmount'}">确收</span>-->
<!-- </div>-->
<div class="echarts-box" id="notReceived"></div>
<!-- 表格区域beign -->
<div style="width: 100%">
@@ -184,7 +177,7 @@ export default {
initEcharts(data) {
let color = ['#069F99', '#88C87E ', '#6D7FD0', '#FA9D81', '#A5B3FF']
let echartsData = data.reduce((pre, val) => {
return pre.concat({value: val.money, name: val.name, money: val.money})
return val.name !== '总数' ? pre.concat({value: val.money, name: val.name, money: val.money}) : pre
}, []).slice(0,4)
echartsData = this.initPoint(echartsData, color)
let chartDom = document.getElementById('notReceived')
@@ -206,10 +199,10 @@ export default {
}
},
legend: {
left:'15%',
bottom: '2%',
right: '2%',
padding: [0, 50, 0, 50],
width: '80%',
// padding: [0, 50, 0, 50],
type: 'scroll',
itemGap:50
},
labelLine: {
@@ -371,6 +364,10 @@ export default {
text-align: center;
}
}
.search-class {
position: relative;
padding-top: 21px;
}
.active {
background: #069F99;
@@ -380,7 +377,7 @@ export default {
.echarts-box {
min-width: 300px;
width: 100%;
height: 400px;
height: 440px;
}
.point {
@@ -240,6 +240,9 @@ export default {
},
legend: {
data: [ '预估收入金额', '确认收入金额', '开票金额', '到账金额'],
lineStyle: {
type: 'solid'
},
right: '2%'
},
grid: {
@@ -224,6 +224,9 @@ export default {
},
legend: {
data: ['预估收入金额', '确认收入金额', '开票金额', '到账金额'],
lineStyle: {
type: 'solid'
},
right: '2%'
},
grid: {
@@ -326,6 +326,9 @@ export default {
legend: {
type: 'scroll',
data: legend,
lineStyle: {
type: 'solid'
},
right: '2%'
},
grid: {
@@ -304,6 +304,9 @@ export default {
legend: {
type: 'scroll',
data: legend,
lineStyle: {
type: 'solid'
},
right: '2%'
},
grid: {
@@ -136,6 +136,7 @@ export default {
this.form.resetFields()
this.model = Object.assign({}, record)
this.visible = true
this.model.principalIdB = this.model.principalIdB || undefined
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'name', 'abbreviation', 'remarks', 'principalIdA', 'principalIdB'))
})
@@ -258,7 +258,7 @@ export default {
created() {
this.draftingGroupProject = this.$route.query.draftingGroupProject
this.draftingGroupProjectId = this.$route.query.draftingGroupProjectId
this.canOperate = this.$route.query.canOperate === 'true' ? true : false
// this.canOperate = this.$route.query.canOperate === 'true' ? true : false
this.filters.draftingGroupId = this.draftingGroupProjectId
this.loadData(1)
},
@@ -97,16 +97,12 @@
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
<a @click="goUnderStudyProject(record)" v-has="'draftingGroup:underStudyProject'"
v-if="record.checkoutOperation === 1">在研项目</a>
<a @click="goUnderStudyProject(record)" v-has="'draftingGroup:underStudyProject'">在研项目</a>
<a @click="goFilesMaintenance(record)" v-has="'draftingGroup:fileMaintenance'">其他分发资料</a>
<a @click="goConferenceMaintenance(record)" v-has="'draftingGroup:meetingMaintenance'">起草组会议</a>
<a @click="copyDraftGroup(record.id)" v-has="'draftingGroup:copy'"
v-if="record.checkoutOperation === 1">复制</a>
<a @click="handleEdit(record)" v-has="'draftingGroup:edit'"
v-if="record.checkoutOperation === 1">基本信息维护</a>
<a @click="handleDelete(record.id)" v-has="'draftingGroup:delete'"
v-if="record.checkoutOperation === 1">删除</a>
<a @click="copyDraftGroup(record.id)" v-has="'draftingGroup:copy'">复制</a>
<a @click="handleEdit(record)" v-has="'draftingGroup:edit'">基本信息维护</a>
<a @click="handleDelete(record.id)" v-has="'draftingGroup:delete'">删除</a>
</span>
</a-table>
</div>
@@ -281,7 +277,7 @@ export default {
path: '/projectManagement/WorkingGroupProjectDataMaintenance',
query: {
draftingGroupId: record.id,
canOperate: record.checkoutOperation === 1
canOperate: true
}
})
},
@@ -295,7 +291,7 @@ export default {
query: {
draftingGroupProject: record.draftingGroupProject,
draftingGroupProjectId: record.id,
canOperate: record.checkoutOperation === 1,
canOperate: true,
meetingType: '7'
}
})
@@ -325,7 +321,7 @@ export default {
query: {
draftingGroupProject: record.draftingGroupProject,
draftingGroupProjectId: record.id,
canOperate: record.checkoutOperation === 1
canOperate: true
}
})
},
@@ -101,6 +101,10 @@
<a-button type="danger" icon="delete" @click="batchDel" v-has="'draftingGroupMember:batchDel'" v-if="canOperate">
批量删除
</a-button>
<a-button type="primary" icon="check" @click="handleBatchCheck" v-has="'draftingGroupMember:check'" v-if="canOperate">
批量审核
</a-button>
<!--<a-button type="primary" @click="setLabel" v-has="'workingGroupMember:setLabel'">设置标签</a-button>-->
</div>
<!-- /操作按钮区域-end-->
@@ -150,6 +154,8 @@
<drafting-group-member-unit-module ref="modalForm" @ok="modalFormOk"></drafting-group-member-unit-module>
<!-- 审核弹框 -->
<drafting-group-member-unit-check-module ref="draftingGroupMemberUnitCheckModule" @ok="modalFormOk"/>
<!-- 批量审核弹框 -->
<drafting-group-member-unit-batch-check-module ref="draftingGroupMemberUnitBatchCheckModule" @ok="modalFormOk" />
</div>
</template>
@@ -165,6 +171,8 @@ import PreviewFile from '../../components/jero/PreviewFile'
import {createQcCode} from '@api/incomeMeetingApi'
import DraftingGroupMemberUnitCheckModule from '@views/draftingGroup/modules/DraftingGroupMemberUnitCheckModule'
import { ProjectTypeEnums } from '../../enums/commonEnums'
import DraftingGroupMemberUnitBatchCheckModule
from '@views/draftingGroup/modules/DraftingGroupMemberUnitBatchCheckModule'
// eslint-disable-next-line no-undef,no-unused-vars
const Base64 = require('js-base64').Base64
@@ -172,6 +180,7 @@ const Base64 = require('js-base64').Base64
export default {
name: 'DraftingGroupMemberUnitMaintenance',
components: {
DraftingGroupMemberUnitBatchCheckModule,
DraftingGroupMemberUnitCheckModule,
PageHeaderTitle,
ProjectDetailModal,
@@ -358,6 +367,15 @@ export default {
this.initWorkGroupData()
},
methods: {
// 批量审核
handleBatchCheck () {
// 必须都是待审核 1.待审核 2.已通过 3.已驳回
if (this.selectionRows.some(item => item.checkResult !== 1)) {
this.$message.warn('勾选数据需要是待审核数据')
return
}
this.$refs.draftingGroupMemberUnitBatchCheckModule.open(this.selectionRows)
},
handleCheck (record) {
this.$refs.draftingGroupMemberUnitCheckModule.open(record)
},
@@ -385,7 +403,7 @@ export default {
this.spinning = true
this.draftingGroupProject = this.$route.query.draftingGroupProject || ''
this.draftingGroupProjectId = this.$route.query.draftingGroupProjectId || ''
this.canOperate = this.$route.query.canOperate === 'true' ? true : false
// this.canOperate = this.$route.query.canOperate === 'true' ? true : false
this.filters.draftingGroupId = this.draftingGroupProjectId
this.importParam.draftGroupId = this.draftingGroupProjectId
this.loadData()
@@ -0,0 +1,220 @@
<!--起草组批量审核弹框-->
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<section class="check">
<h3>报名信息</h3>
<div v-for="row in selectRows" :key="row.id">
<a-row :gutter="24">
<a-col :span="24">
<label>参会企业</label>
<span>{{ row.chargeCompanyTemporaryName }}</span>
</a-col>
</a-row>
<a-row :gutter="24" v-for="item in row.payDraftingGroupSubItemContactsList" :key="item.id">
<a-col :span="12">
<label>姓名</label>
<span>{{ item.contactsTemporaryName }}</span></a-col>
<a-col :span="12">
<label>备注</label>
<span>{{ item.remarks }}</span></a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<label>备注</label>
<span>{{ row.remarks }}</span>
</a-col>
</a-row>
</div>
</section>
<h3>审核</h3>
<a-form :form="form">
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="审核" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['checkResult',validatorRules.checkResult]" placeholder="请选择审核结果"
@change="changeCheck">
<a-radio value="2">
通过
</a-radio>
<a-radio value='3'>
驳回
</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark',validatorRules.checkRemark]"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="!checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark']"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
<template slot="footer">
<a-button @click="handleCancel">关闭</a-button>
<a-button type="primary" @click="handleOk" v-preventclick>确定</a-button>
</template>
</j-modal>
</template>
<script>
import {postAction} from '@api/manage'
export default {
name: 'DraftingGroupMemberUnitBatchCheckModule',
data() {
return {
title: '批量审核入会信息',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
selectRows: [],
labelCol: {
xs: {span: 24},
sm: {span: 6}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 18}
},
remarksLabelCol: {
xs: {span: 24},
sm: {span: 3}
},
remarksWrapperCol: {
xs: {span: 24},
sm: {span: 21}
},
validatorRules: {
checkRemark: {
rules: [{required: true, message: '请输入审核说明'}],
validateTrigger: 'blur'
},
checkResult: {
rules: [{required: true, message: '请选择审核结果'}],
validateTrigger: 'change'
}
},
url: {
// 审核报名信息
check: '/drafting/payDraftingGroupSubitem/checkRegister'
},
// 审核结果选择
checkBool: false
}
},
methods: {
open(selectRows) {
console.log(selectRows)
this.form.resetFields()
this.selectRows = selectRows
this.visible = true
},
close() {
this.$emit('close')
this.visible = false
this.selectRows = []
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
const formData = Object.assign({}, values)
formData.id = this.selectRows.map(item => item.id).join(',')
postAction(this.url.check, formData).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.confirmLoading = false
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
that.confirmLoading = false
})
}
})
},
handleCancel() {
this.close()
},
/*
* 选择审核结果
* */
changeCheck(e) {
console.log(e)
// 审核结果选择拒绝 审核说明必填
if (e.target.value === '2') {
this.checkBool = false
} else if (e.target.value === '3') {
this.checkBool = true
}
}
}
}
</script>
<style scoped lang="less">
.check {
.ant-row {
line-height: 3;
.ant-col {
label {
color: #999;
}
span {
color: black;
}
}
}
.label {
color: #999999;
}
.content {
color: black;
}
}
.color-999 {
color: #999;
}
.color-black {
color: black;
}
</style>
@@ -640,8 +640,8 @@ export default {
* @param index
*/
handleAddContact(index) {
if (this.model.payDraftingGroupSubItemContactsList.length >= 10) {
this.$message.warn('最多添加十个企业联系人')
if (this.model.payDraftingGroupSubItemContactsList.length >= 20) {
this.$message.warn('最多添加十个企业联系人')
return
}
let obj = {
@@ -175,9 +175,13 @@
:disabled="record.projectType === 3 && record.registerCheckResult === '0'">来款</a>
<!-- 2024年2月变更 :disabled="record.needInvoice === 0" -->
<a @click="invoicing(record)"
v-has="'incomePaymentAndInvoiving:invoicing'">开票</a>
v-has="'incomePaymentAndInvoiving:invoicing'" :disabled="record.needInvoice === 0">开票</a>
<!-- 确认收入项目--- 普通项目工作组项目资料网员 项目 可以确认收入 报名状态是 待审核的时候 不能确认收入-->
<a v-has="'incomePaymentAndInvoiving:confirmPayment'" @click="confirmPayment(record)">确认收入</a>
<!-- 修改-待确收金额- 如果有到账确收开票时需要同步修改状态 --->
<a v-has="'incomePaymentAndInvoiving:editReceivableAmount'" @click="editReceivableAmount(record)">修改</a>
<!--工作组项目普通项目资料网员项目可以修改发票信息-->
<a v-has="'packProject:changeInvoiceInfo'" @click="changeInvoiceInfo(record)" :disabled="Number(record.projectType) !== ProjectTypeEnums.GENERAL_PRO.value && Number(record.projectType) !== ProjectTypeEnums.GROUP_PRO.value && Number(record.projectType) !== ProjectTypeEnums.MEMBER_PRO.value">开票类型</a>
@@ -239,7 +243,14 @@
@ok="modalFormOk"
>
</invoice-info-change-module>
<!--修改待确认金额-->
<edit-receivable-amount
ref="editReceivableAmount"
:project-id="selectProjectId"
:project-type="selectProjectType"
@ok="modalFormOk"
>
</edit-receivable-amount>
</div>
</template>
@@ -263,6 +274,7 @@ import {getPayConfirmList} from '../../../api/incomePaymentsApi'
import JDictSelectTag from '@comp/dict/JDictSelectTag'
import InvoiceInfoChangeModule from '../../packManagement/modules/InvoiceInfoChangeModule'
import { formatMoney } from '@/utils/formatMoney'
import EditReceivableAmount from './modules/EditReceivableAmount'
// 项目类型 数据字典 的定义 和数据库的保持一致
const ProjectTypeEnums = {
@@ -290,7 +302,9 @@ export default {
AuditProofModule,
AuditModal,
ConfirmStageModule,
InvoiceInfoChangeModule
InvoiceInfoChangeModule,
// 修改待确收金额
EditReceivableAmount
},
mixins: [JeroListMixin],
data() {
@@ -398,7 +412,7 @@ export default {
dataIndex: 'action',
align: 'center',
fixed: 'right',
width: 300,
width: 380,
scopedSlots: {customRender: 'action'}
}
],
@@ -632,6 +646,15 @@ export default {
// this.confirmStageVisible = true
this.$refs.changeInvoiceInfo.open(record)
},
/**
* 修改-待确收金额-果有到账、确收、开票时需要同步修改状
* @param record
*/
editReceivableAmount(record) {
this.selectProjectType = record.projectType
this.selectProjectId = record.id
this.$refs.editReceivableAmount.edit(record)
}
}
}
@@ -0,0 +1,192 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
okText="保存"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item label="待确收金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入待确收金额"
v-decorator="['receivableAmount',validatorRules.receivableAmount]"
:maxLength='50'
@blur="addZeroAmount"
@change="e => e.target.value = (e.target.value.replace(/[^0-9-.]/g, '')).trim()"></a-input>
</a-form-item>
<!-- <a-form-item label="税率" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag @change="changeRate" placeholder="请选择税率" dict-code="rate" :trigger-change="true"
v-decorator="['taxRate',validatorRules.taxRate]"></j-dict-select-tag>
</a-form-item>
<a-form-item label="税额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入税额"
v-decorator="['tax',validatorRules.tax]"
:maxLength='50'
disabled
@change="e => e.target.value = (e.target.value.replace(/[^0-9-.]/g, '')).trim()"></a-input>
</a-form-item>
<a-form-item label="未税金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入未税金额"
disabled
v-decorator="['noTaxAmount',validatorRules.noTaxAmount]"
:maxLength='50'
@change="e => e.target.value = (e.target.value.replace(/[^0-9-.]/g, '')).trim()"></a-input>
</a-form-item>-->
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { addZero } from '../../../../utils/util'
import { TaxOperateMixin } from './TaxOperateMixin'
import {httpAction} from '@api/manage'
export default {
name: 'EditReceivableAmount',
props: {
// 项目id
projectId: {
type: String,
required: false,
default: null
},
// 项目类型
projectType: {
type: [Number, String],
required: false,
default: null
}
},
mixins: [TaxOperateMixin],
watch: {
// 监听是否需要发票 然后修改响应的税率值
needInvoice(value) {
this.taxRate = value ? 0.06 : 0
}
},
data() {
return {
title: '修改待确收金额',
width: 600,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
url: {
// 接口名称
edit: '/paymentRecord/payPaymentRecord/editReceivableAmount'
},
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 }
},
validatorRules: {
receivableAmount: {
rules: [{ required: true, validator: this.checkMoney }],
validateTrigger: 'blur'
},
taxRate: {
rules: [{ required: true,message: '请选择税率' }],
validateTrigger: 'change',initialValue:'0.06'
},
noTaxAmount: {
rules: [{required: true, validator: this.checkNoTaxMoney}],
validateTrigger: 'blur'
},
tax: {
rules: [{required: true, validator: this.checkTaxMoney}],
validateTrigger: 'blur'
},
paymentDate: {
rules: [{ required: true, message: '请选择来款日期' }],
validateTrigger: 'change'
}
}
}
},
methods: {
addZero,
edit(record) {
this.visible = true
this.form.resetFields()
this.model = Object.assign({}, record)
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'receivableAmount'))
this.taxRate = this.form.getFieldValue('taxRate')
})
},
/**
* 改变税率计算 到账金额 与税额
* */
changeRate(val){
this.taxRate = val
let amount = this.form.getFieldValue('receivableAmount')
if(!amount) return
let obj = this.calcOtherNumber(amount)
this.$nextTick(() => {
this.form.setFieldsValue( {tax:obj.tax,noTaxAmount: obj.noTaxAmount})
})
},
handleOk() {
if (this.confirmLoading) {
return
}
const that = this
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let method = 'post'
let url = this.url.edit
const formData = Object.assign({}, values)
// 项目id
formData.projectId = this.projectId
// 项目类型
formData.projectType = this.projectType
httpAction(url, formData, method).then(res => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.handleCancel()
that.confirmLoading = false
} else {
this.$message.warn(res.message)
}
}).finally(() => {
that.confirmLoading = false
})
}
})
},
handleCancel() {
this.close()
},
close() {
this.visible = false
},
// 校验金额格式
checkMoney(rules, value, callback) {
this.checkMoneyTemplate(rules, value, callback, '待确收金额')
},
checkNoTaxMoney(rules, value, callback) {
this.checkMoneyTemplate(rules, value, callback, '未税金额')
},
checkTaxMoney(rules, value, callback) {
this.checkMoneyTemplate(rules, value, callback, '税额')
},
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,328 @@
<template>
<div>
<page-header-title v-if="$route.query.id" :is-level-one="false" :level-two-title="$route.query.title"></page-header-title>
<page-header-title v-else :img-for-icon="IconDraftingGruop"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xxl="6" :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="项目名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入项目名称" v-model="queryParam.projectName" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xxl="6" :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="负责人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-principal placeholder="请选择负责人" v-model="queryParam.principalId"></select-principal>
</a-form-item>
</a-col>
<a-col :xl="4" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery"
v-has="'safetyCenter:search'">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'safetyCenter:add'">新增</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'safetyCenter:batchDel'">批量删除</a-button>
</div>
<!-- /操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1000}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, getCheckboxProps: getCheckboxProps}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 项目名称-->
<template slot="projectName" slot-scope="text, record">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="primary-color text-over" @click="goMemberUnitMaintenance(record)">{{ text }}</div>
</a-tooltip>
</template>
<template slot="text" slot-scope="text">
<j-ellipsis :value="text" :length="20"></j-ellipsis>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
<!-- 研究组可以点击在研项目显示项目组的信息 -->
<a @click="goUnderStudyProject(record)" v-has="'safetyCenter:underStudyProject'"
v-if="record.projectType + '' === SafetyCenterProjectTypeEnums.studyGroup.value">在研项目</a>
<a @click="goFilesMaintenance(record)" v-has="'safetyCenter:fileMaintenance'">其他分发资料</a>
<a @click="goConferenceMaintenance(record)" v-has="'safetyCenter:meetingMaintenance'">项目会议</a>
<!--<a @click="handleCopy(record.id)" v-has="'safetyCenter:copy'">复制</a>-->
<a @click="handleEdit(record)" v-has="'safetyCenter:edit'">基本信息维护</a>
<a @click="handleDelete(record.id)" v-has="'safetyCenter:delete'"
v-if="record.projectType + '' === SafetyCenterProjectTypeEnums.projectGroup.value">删除</a>
</span>
</a-table>
</div>
<!-- /table表格区域-->
</a-card>
<!--新增基本信息维护-->
<safety-center-module ref="modalForm" @ok="modalFormOk"></safety-center-module>
</div>
</template>
<script>
import { JeroListMixin } from '@/mixins/JeroListMixin'
import SelectPrincipal from '@comp/company/SelectPrincipal'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconDraftingGruop from '@/assets/imgs/icon/icon_drafting_group.png'
import { getAction } from '@api/manage'
import SafetyCenterModule from '@views/functionalSafetyCenter/modules/SafetyCenterModule'
import {MeetingTypeEnums, SafetyCenterProjectTypeEnums} from '@/enums/commonEnums'
export default {
name: 'FunctionalSafetyCenter',
components: {SafetyCenterModule, SelectPrincipal, PageHeaderTitle },
mixins: [JeroListMixin],
data() {
return {
disableMixinCreated: true,
// 混入post请求删除接口
postMethodDel: true,
SafetyCenterProjectTypeEnums,
IconDraftingGruop,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
url: {
list: '/SafetyCenter/page',
delete: '/SafetyCenter/delete',
deleteBatch: '/SafetyCenter/deleteBatch'
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}, {
title: '项目名称',
align: 'center',
dataIndex: 'projectName',
scopedSlots: { customRender: 'projectName' }
}, {
title: '负责人',
align: 'center',
width: 130,
dataIndex: 'principalId_dictText'
}, {
title: '操作',
dataIndex: 'action',
align: 'center',
fixed: 'right',
width: 500,
scopedSlots: { customRender: 'action' }
}
],
queryParam: {},
lastQueryParam: {}
}
},
created () {
// 如果有id展示项目组数据接口
if (this.$route.query.id) {
this.filters.parentId = this.$route.query.id
this.url.list = '/SafetyCenter/projectGroupPage'
}
this.loadData()
},
methods: {
getCheckboxProps (record) {
return {
props: {
// 一级禁用,防止勾选删除
disabled: record.projectType + '' === SafetyCenterProjectTypeEnums.safetyCenter.value
}
}
},
loadData(arg) {
if (!this.url.list) {
this.$message.error('请设置url.list属性!')
return
}
//加载数据 若传入参数1则加载第一页的内容
if (arg === 1) {
this.ipagination.current = 1
}
var params = this.getQueryParams()//查询条件
this.loading = true
getAction(this.url.list, params).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------
this.dataSource = res.result.records || res.result
if (res.result.total) {
this.ipagination.total = res.result.total
//清空列表选中
this.onClearSelected()
} else {
this.ipagination.total = 0
}
//update-end---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------
}
if (res.code === 510) {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
/**
* 文件维护
* @param record
*/
goFilesMaintenance(record) {
console.log(record)
this.$router.push({
path: '/projectManagement/WorkingGroupProjectDataMaintenance',
query: {
safetyCenterId: record.id,
canOperate: true
}
})
},
/**
* 会议维护
* @param record
*/
goConferenceMaintenance(record) {
this.$router.push({
path: '/functionalSafetyCenter/FunctionalSafetyConferenceMaintenance',
query: {
projectName: record.projectName,
projectId: record.id,
canOperate: true,
meetingType: MeetingTypeEnums.safetyCenter.value
}
})
},
/**
* 成员维护
* @param record
*/
goMemberUnitMaintenance(record) {
this.$router.push({
path: '/functionalSafetyCenter/FunctionalSafetyMemberUnitMaintenance',
query: {
projectName: record.projectName,
projectId: record.id,
canOperate: true
}
})
},
searchReset() {
this.lastQueryParam = {
year: new Date().getFullYear().toString()
}
this.queryParam = {
year: new Date().getFullYear().toString()
}
this.loadData(1)
},
/**
* 在研项目
* @param record
*/
goUnderStudyProject(record) {
console.log(record)
this.$router.push({
path: '/functionalSafetyCenter',
query: {
title: record.projectName,
id: record.id
}
})
},
/**
* 重写编辑
* @param record
*/
handleEdit(record) {
this.$refs.modalForm.edit(record)
this.$refs.modalForm.title = '基本信息维护'
this.$refs.modalForm.disableSubmit = false
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.tooltip {
float: right;
width: auto;
display: flex;
justify-content: flex-end;
align-items: flex-end;
height: 40px;
&-item {
margin-right: 10px;
display: flex;
align-items: center;
}
&-color {
width: 13px;
height: 13px;
margin-right: 5px;
border-radius: 2px;
}
&-pay-in-full {
background: linear-gradient(0deg, #069f99 0%, #07b0a9 100%);
}
&-partial-payment {
background: linear-gradient(0deg, #0075a9 0%, #0096d8 100%);
}
&-non-payment {
background: #e8e8e8;
}
}
.text-over {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
@@ -0,0 +1,399 @@
<template>
<div>
<page-header-title :is-level-one="false" :level-two-title="projectName"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="会议名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入会议名称" v-model="queryParam.meetingName" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="12" :md="12" :sm="24">
<a-form-item label="会议时间">
<j-date
placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam.meetingStartTime"
:disabled-date="disabledStartDate">
</j-date>
<span class="query-group-split-cust"></span>
<j-date
placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam.meetingEndTime"
:disabled-date="disabledEndDate">
</j-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="年份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-year-date style="width:100%" placeholder="请选择年份"
v-model="queryParam.particularYear"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="12" :md="12" :sm="24">
<a-form-item label="创建时间">
<j-date
placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam.createTime_begin"
:disabled-date="disabledStartCreateDate">
</j-date>
<span class="query-group-split-cust"></span>
<j-date
placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam.createTime_end"
:disabled-date="disabledEndCreateDate">
</j-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="已提醒" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag style="width: 100%"
dict-code="yn"
v-model="queryParam.remind"
placeholder="请选择提醒类型"></j-dict-select-tag>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery"
v-has="'safetyCenterMeeting:search'">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'safetyCenterMeeting:add'" v-if="canOperate">新增
</a-button>
<a-button type="primary" icon="export" @click="handleExportXls('功能安全中心会议')"
v-has="'safetyCenterMeeting:export'">导出
</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'safetyCenterMeeting:batchDel'" v-if="canOperate">
批量删除
</a-button>
<a-button type="primary" @click="publishRemind" v-has="'safetyCenterMeeting:publish'" v-if="canOperate">发布
</a-button>
</div>
<!-- /操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:scroll="{x:true}"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 会议名称 点击去参会情况-->
<template slot="htmlSlot" slot-scope="text, record">
<j-ellipsis v-if="!!text" class="primary-color" :value="text" :length="20"
@click="toAttendance(record)"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<j-ellipsis :value="text" :length="20"></j-ellipsis>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record" v-if="canOperate">
<a @click="uploadFile(record,'1')" v-has="'safetyCenterMeeting:uploadCouncil'">会议纪要</a>
<a @click="uploadFile(record,'2')" v-has="'safetyCenterMeeting:upload'">上传文件</a>
<!-- <a @click="applyMsg">报名信息</a>-->
<a @click="handleEdit(record)" v-has="'safetyCenterMeeting:edit'">编辑</a>
<a @click="handleDelete(record.id)" v-has="'safetyCenterMeeting:delete'">删除</a>
</span>
</a-table>
</div>
<publish-remind-modal ref="publishRemindModal" @ok="modalFormOk"></publish-remind-modal>
<upload-meet-file-modal ref="modalForm" @ok="modalFormOk"></upload-meet-file-modal>
</a-card>
</div>
</template>
<script>
import { JeroListMixin } from '@/mixins/JeroListMixin'
import { RangeDateMixin } from '@/mixins/RangeDateMixin'
import JYearDate from '@comp/jero/JYearDate'
import JDate from '@comp/tools/JDate'
import moment from 'moment'
import JDictSelectTag from '@comp/dict/JDictSelectTag'
import PublishRemindModal from '@views/projectManagement/modules/PublishRemindModal'
import UploadMeetFileModal from '@views/incomePayments/meetManage/modules/UploadMeetFileModal'
import '@/assets/less/TableExpand.less'
import PageHeaderTitle from '../../components/layouts/PageHeaderTitle'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
name: 'FunctionalSafetyCenterConferenceMaintenance',
components: {
JYearDate,
JDate,
JDictSelectTag,
PublishRemindModal,
UploadMeetFileModal,
PageHeaderTitle
},
mixins: [JeroListMixin, RangeDateMixin],
data() {
return {
projectName: '',
projectId: '',
disableMixinCreated: true,
list: [],
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
dateKeyObj: {
beginKey: 'meetingStartTime',
endKey: 'meetingEndtTime'
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '会议名称',
align: 'center',
dataIndex: 'meetingName',
scopedSlots: { customRender: 'htmlSlot' },
width: 160
},
{
title: '会议类型',
align: 'center',
dataIndex: 'meetingType_dictText',
width: 100,
scopedSlots: { customRender: 'text' }
},
{
title: '负责人',
align: 'center',
dataIndex: 'directorName',
width: 160,
scopedSlots: { customRender: 'text' }
},
{
title: '召开时间',
align: 'center',
dataIndex: 'startTime',
width: 200,
customRender: (text, record) => (
<j-ellipsis value={ record.startTime + '~' + record.endTime } length={ 20 }></j-ellipsis>)
},
{
title: '召开地点',
align: 'center',
dataIndex: 'venue',
width: 200,
customRender: (text, record) => (
<j-ellipsis value={ text + '/' + record.address } length={ 20 }></j-ellipsis>)
},
{
title: '年份',
align: 'center',
dataIndex: 'particularYear',
width: 120,
scopedSlots: { customRender: 'text' }
},
{
title: '已提醒',
align: 'center',
dataIndex: 'remind_dictText',
width: 100,
scopedSlots: { customRender: 'text' }
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createTime',
scopedSlots: { customRender: 'text' }
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 160,
scopedSlots: { customRender: 'action' }
}
],
url: {
list: '/meeting/safetyCenterMeeting/page',
delete: '/meeting/safetyCenterMeeting/delete',
deleteBatch: '/meeting/safetyCenterMeeting/deleteBatch',
exportXlsUrl: '/meeting/safetyCenterMeeting/exportXls'
},
canOperate: true // 是否可操作(负责人B不可操作)
}
},
created() {
this.projectName = this.$route.query.projectName
this.projectId = this.$route.query.projectId
this.filters.safetyCenterId = this.projectId
this.loadData(1)
},
methods: {
/**
* 返回项目列表
*/
backWorkingGroupProject() {
this.$router.push({
path: '/functionalSafetyCenter'
})
},
/*
* 新增
* */
handleAdd() {
// 记录当前的项目id
let currentId = this.$route.query.projectId
this.$router.push({
path: '/incomePayments/meetManage/AddOrDetailMeet',
query: {
safetyCenterId: currentId,
meetingType: MeetingTypeEnums.safetyCenter.value
}
})
},
/*
* 编辑
* */
handleEdit(record) {
// 记录当前的工作组id
let currentId = this.$route.query.projectId
this.$router.push({
path: '/incomePayments/meetManage/AddOrDetailMeet',
query: {
safetyCenterId: currentId,
id: record.id
}
})
},
/*
* 发布
* */
publishRemind() {
if (this.selectionRows.length === 0) {
this.$message.warn('请选择一个会议')
return
} else {
// 传入选中的会议id
this.$refs.publishRemindModal.open(this.selectedRowKeys)
this.$refs.publishRemindModal.title = '发布'
}
},
/*
* 上传文件
* */
uploadFile(record,type) {
this.$refs.modalForm.edit(record,type)
},
/*
* 报名信息
* */
applyMsg() {
this.$router.push({
path: '/incomePayments/meetManage/SignUpInfoList'
})
},
/*
* 参会情况
* */
toAttendance(record) {
this.$router.push({
path: '/incomePayments/meetManage/AttendanceFunctionalSafetyCenter',
query: {
id: record.id,
meetingName: record.meetingName,
meetingType: MeetingTypeEnums.safetyCenter.value
}
})
},
/*
* 创建时间开始禁用
* */
disabledStartCreateDate(startValue) {
const endValue = this.queryParam.createTime_end && moment(this.queryParam.createTime_end, this.rangeDateFormat.end)
if (!startValue || !endValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
/*
* 创建时间结束禁用
* */
disabledEndCreateDate(endValue) {
const startValue = this.queryParam.createTime_begin && moment(this.queryParam.createTime_begin, this.rangeDateFormat.begin)
if (!endValue || !startValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
/*
* 修改查询条件
* */
searchQuery() {
// this.queryParam.meetingStartTime = this.queryParam.meetingStartTime ? this.queryParam.meetingStartTime + ' ' + '00:00:00' : undefined
// this.queryParam.meetingEndTime = this.queryParam.meetingEndTime ? this.queryParam.meetingEndTime + ' ' + '23:59:59' : undefined
// this.queryParam.createTime_begin = this.queryParam.createTime_begin ? this.queryParam.createTime_begin + ' ' + '00:00:00' : undefined
// this.queryParam.createTime_end = this.queryParam.createTime_end ? this.queryParam.createTime_end + ' ' + '23:59:59' : undefined
this.lastQueryParam = { ...this.queryParam }
if(this.lastQueryParam.meetingStartTime) this.lastQueryParam.meetingStartTime = this.lastQueryParam.meetingStartTime + ' ' + '00:00:00'
if(this.lastQueryParam.meetingEndTime) this.lastQueryParam.meetingEndTime = this.lastQueryParam.meetingEndTime + ' ' + '23:59:59'
if(this.lastQueryParam.createTime_begin) this.lastQueryParam.createTime_begin = this.lastQueryParam.createTime_begin + ' ' + '00:00:00'
if(this.lastQueryParam.createTime_end) this.lastQueryParam.createTime_end = this.lastQueryParam.createTime_end + ' ' + '23:59:59'
this.loadData(1)
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.title {
&-text {
padding-left: 1rem;
font-size: 18px;
line-height: 22px;
}
}
.divider {
height: 1px;
background-color: #cccccc;
margin: 15px -24px;
}
</style>
@@ -0,0 +1,379 @@
<template>
<div>
<page-header-title :is-level-one="false" :level-two-title="projectName"></page-header-title>
<a-card :bordered="false">
<div class="part-title">
<div class="part-title-text">项目信息</div>
</div>
<!-- 信息区域-->
<a-spin :spinning="spinning">
<div class="work-group-detail">
<div class="work-group-detail-item work-group-detail-item-small"
v-for="(item, index) in detailTitleList"
:key="index">
<div class="work-group-detail-item-title">{{ item.title }}</div>
<div class="work-group-detail-item-content work-group-detail-item-filename"
v-if="(item.fieldName === 'chargeNoticeAId' || item.fieldName === 'chargeNoticeBId') && detail[item.fieldName]">
<preview-file :file-id="detail[item.fieldName]"></preview-file>
</div>
<div class="work-group-detail-item-content" v-else>{{ detail[item.fieldName] }}</div>
</div>
<div class="work-group-detail-item">
<div class="work-group-detail-item-title">任务及目标</div>
<div class="work-group-detail-item-content">{{ detail.missionAndObjectives }}</div>
</div>
<div class="work-group-detail-item">
<div class="work-group-detail-item-title">备注</div>
<div class="work-group-detail-item-content">{{ detail.remarks }}</div>
</div>
</div>
</a-spin>
<!-- /信息区域-->
<a-divider></a-divider>
<!-- 查询区域-->
<div class="part-title">
<div class="part-title-text">成员信息</div>
</div>
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="成员单位" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入成员单位" v-model="queryParam.companyName"
:maxLength='50'></a-input>
</a-form-item>
</a-col>
<!--<a-col :xl="6" :lg="7" :md="8" :sm="24">-->
<!-- <a-form-item label="标签名称" :labelCol="labelCol" :wrapperCol="wrapperCol">-->
<!-- <a-input placeholder="请输入标签名称" v-model="queryParam.label" :maxLength='50'></a-input>-->
<!-- </a-form-item>-->
<!--</a-col>-->
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery"
v-has="'safetyCenterMember:search'">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'safetyCenterMember:add'" v-if="canOperate">
添加成员
</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :data="importParam"
:action="importExcelUrl" @change="handleImportExcel" v-has="'safetyCenterMember:import'"
v-if="canOperate">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
<a-button type="primary" icon="export" @click="handleExportXls('功能安全中心成员')" v-has="'safetyCenterMember:export'">
导出
</a-button>
<a-button type="primary" icon="download" @click="downTemplate('功能安全中心成员导入模板')"
v-has="'safetyCenterMember:downTemplate'" v-if="canOperate">下载模板
</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'safetyCenterMember:batchDel'" v-if="canOperate">
批量删除
</a-button>
<!--<a-button type="primary" @click="setLabel" v-has="'workingGroupMember:setLabel'">设置标签</a-button>-->
</div>
<!-- /操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 800}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 名称-->
<template slot="projectName" slot-scope="text, record">
<j-ellipsis :value="text"
:length="18"
class="primary-color"
@click="openDetailModal(record)"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record" v-if="canOperate">
<a @click="handleEdit(record)" v-has="'safetyCenterMember:edit'">编辑</a>
<a @click="handleDelete(record.id)" v-has="'safetyCenterMember:delete'">删除</a>
</span>
</a-table>
</div>
</a-card>
<project-detail-modal ref="projectDetail" :project-type="ProjectTypeEnums.SAFETY_CENTER_PRO.value"></project-detail-modal>
<!-- 控制功能安全中心可以选择全部其他的都只能选择父级选的 -->
<safety-center-member-unit-module :is-safety-center="isSafetyCenter" ref="modalForm" @ok="modalFormOk"></safety-center-member-unit-module>
</div>
</template>
<script>
import { JeroListMixin } from '@/mixins/JeroListMixin'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import {getSafetyCenterById} from '@api/incomePaymentsApi'
import ProjectDetailModal from '../../components/ProjectDetailModal'
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import PreviewFile from '../../components/jero/PreviewFile'
import {ProjectTypeEnums, SafetyCenterProjectTypeEnums} from '@/enums/commonEnums'
import SafetyCenterMemberUnitModule
from '@views/functionalSafetyCenter/modules/SafetyCenterMemberUnitModule'
// eslint-disable-next-line no-undef,no-unused-vars
const Base64 = require('js-base64').Base64
export default {
name: 'FunctionalSafetyMemberUnitMaintenance',
components: {
SafetyCenterMemberUnitModule,
PageHeaderTitle,
ProjectDetailModal,
PreviewFile
},
mixins: [JeroListMixin],
computed: {
importExcelUrl: function () {
return `${ window._CONFIG['domianURL'] }/${ this.url.importExcelUrl }`
},
// projectType是否功能安全中心, 1功能安全中心 2研究组 3项目组
isSafetyCenter () {
return this.detail.projectType + '' === SafetyCenterProjectTypeEnums.safetyCenter.value
}
},
data() {
return {
ProjectTypeEnums,
// 混入post请求删除接口
postMethodDel: true,
disableMixinCreated: true,
projectName: '',
projectId: '',
spinning: false,
detailTitleList: [
{
title: '项目名称',
fieldName: 'projectName'
}, {
title: '负责人',
fieldName: 'principalId_dictText'
},
],
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
url: {
list: '/SafetyCenterSubitem/page',
delete: '/SafetyCenterSubitem/delete',
deleteBatch: '/SafetyCenterSubitem/deleteBatch',
exportXlsUrl: '/SafetyCenterSubitem/exportXls',
importExcelUrl: '/SafetyCenterSubitem/importExcel',
downTemplateUrl: '/SafetyCenterSubitem/downloadExcelModel'
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}, {
title: '成员单位',
align: 'center',
// width: 280,
dataIndex: 'companyId_dictText',
scopedSlots: { customRender: 'projectName' }
}, {
title: '企业联系人',
align: 'center',
// width: 280,
dataIndex: 'contactsId_dictText',
scopedSlots: { customRender: 'text' }
},
{
title: '操作',
dataIndex: 'action',
align: 'center',
fixed: 'right',
width: 180,
scopedSlots: { customRender: 'action' }
}
],
detail: {},
chargeNoticeList: [], // 收费通知号选项
importParam: {},
// 给定当年作为来款年份默认查询条件
// queryParam: {
// paymentDate: new Date().getFullYear().toString()
// },
// lastQueryParam: {
// paymentDate: new Date().getFullYear().toString()
// },
canOperate: true // 是否可操作(负责人B不可操作)
}
},
created() {
// 初始化信息
this.initData()
},
methods: {
/**
* 初始化信息
*/
initData() {
this.spinning = true
this.projectName = this.$route.query.projectName || ''
this.projectId = this.$route.query.projectId || ''
this.filters.projectId = this.projectId
this.importParam.projectId = this.projectId
this.loadData()
let param = {
id: this.projectId
}
getSafetyCenterById(param).then(res => {
if (res.success) {
this.detail = res.result || {}
}
}).finally(() => {
this.spinning = false
})
},
handleAdd: function () {
this.$refs.modalForm.projectId = this.projectId
this.$refs.modalForm.add()
this.$refs.modalForm.title = '添加成员'
this.$refs.modalForm.disableSubmit = false
},
handleEdit: function (record) {
this.$refs.modalForm.projectId = this.projectId
this.$refs.modalForm.edit(record)
this.$refs.modalForm.title = '编辑'
this.$refs.modalForm.disableSubmit = false
},
/**
* 文件预览
* @param file
*/
previewFile(file) {
console.log(file)
if (file && file.url) {
const fileFullUrl = `${ window._CONFIG['domianWebSocketURL'] }/sys/common/download/${ file.id }?token=${ Vue.ls.get(ACCESS_TOKEN) }&fullfilename=${ file.fileName }`
// let url = `${ window._CONFIG['onlinePreviewDomainURL'] }?url=${ encodeURIComponent(Base64.encode(fileFullUrl)) }`
let url = `${ window._CONFIG['onlinePreviewDomainURL'] }?url=${ encodeURIComponent(Base64.encode(fileFullUrl)) }`
window.open(url)
}
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.ant-divider-horizontal {
height: 1px;
background-color: #F2F2F2;
margin: 15px 0px;
}
.work-group-detail {
display: flex;
flex-wrap: wrap;
padding-bottom: 20px;
&-item-small {
width: 33.3% !important;
}
&-item {
display: flex;
padding: 5px 5px;
width: 100%;
font-size: 14px;
&-title {
flex-shrink: 0;
color: #999999;
}
&-content {
word-break: break-all;
color: #2F3133;
}
&-filename {
//cursor: pointer;
}
}
}
.table-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.flex-col {
.ant-col {
display: flex;
}
label {
flex-shrink: 0;
}
}
.qr-code {
width: 100px;
height: 100px;
}
.copy {
font-style: normal;
cursor: pointer;
}
.signUpInfo {
line-height: 3;
.ant-col {
label {
color: #999;
}
span {
color: black;
}
}
}
</style>
@@ -0,0 +1,434 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-row>
<a-col>
<a-form-item label="成员单位" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<company-select placeholder="请选择成员单位"
v-decorator="['chargeCompany',validatorRules.chargeCompany]"
:disabled="disabledCompany"
@change="companyChange"
:customListUrl="isSafetyCenter ? '' : companyList"
:customListParams="isSafetyCenter ? {} : customListParams"
:maxLength='50'>
</company-select>
</a-form-item>
</a-col>
</a-row>
<template
v-if="model.contactsList && model.contactsList.length > 0">
<a-row v-for="(item, index) in model.contactsList" :key="index + ''">
<a-col :xl="12" :sm="24">
<a-form-item :label="`企业联系人${index + 1}`" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-contacts :selected-company="selectedCompany"
:placeholder="`请选择企业联系人${index + 1}`"
v-decorator="[`contactsList[${index}].contactsId`, {rules: [{ required: index === 0, validator: index === 0 ? validateContactRequired : validateContact }],validateTrigger: 'change'}]"
:maxLength='50'
:ref="`selectContacts${index}`"
:can-add="isSafetyCenter"
:customListFn="isSafetyCenter ? null : getContactsByCompanyBySafetyCenter"
:customListParams="isSafetyCenter ? {} : customListParams"
@ok="addContactsOneOk"></select-contacts>
</a-form-item>
</a-col>
<a-col :xl="9" :sm="20">
<!-- v-show="hasContactOne"-->
<a-form-item :label="`备注${index + 1}`" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input
:placeholder="`请输入备注${index + 1}`"
v-decorator="[`contactsList[${index}].remarks`]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}">
</a-input>
</a-form-item>
</a-col>
<a-col :xl="3" :sm="4">
<a-button type="link" class="contact-btn" @click="handleAddContact(index)">添加</a-button>
<a-button type="link" class="contact-btn del-btn" @click="handleDelContact(index)">删除</a-button>
</a-col>
</a-row>
</template>
<a-row>
<a-col>
<a-form-item label="备注" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入备注"
:auto-size="{ minRows: 3, maxRows: 6 }"
v-decorator="['remarks']"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { httpAction } from '@api/manage'
import CompanySelect from '@comp/company/CompanySelect'
import SelectContacts from '@comp/company/SelectContacts'
import {getAllDraftProjects} from '@api/incomePaymentsApi'
import { addZero } from '@/utils/util'
import { CalcAmountMixin } from '@/mixins/CalcAmountMixin'
import {getContactsByCompanyBySafetyCenter} from '@api/api'
export default {
name: 'SafetyCenterMemberUnitModule',
components: { CompanySelect, SelectContacts },
mixins: [CalcAmountMixin],
props: {
// 是否安全中心,控制添加成员 只能选择上级的成员还是选择全部
isSafetyCenter: {
type: Boolean,
default: false,
required: false,
}
},
data() {
return {
title: '操作',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
remarksLabelCol: {
xs: { span: 24 },
sm: { span: 4 }
},
remarksWrapperCol: {
xs: { span: 24 },
sm: { span: 20 }
},
validatorRules: {
chargeCompany: {
rules: [{ required: true, validator: this.checkCompany }],
validateTrigger: 'change'
},
contactsIdOne: {
rules: [{ required: true, message: '请选择企业联系人1' }],
validateTrigger: 'change'
},
contactsRepeat: {
rules: [{ required: false, validator: this.validateContact }],
validateTrigger: 'change'
}
},
selectedCompany: null, // 当前选中的企业
selectedContact1: null, // 编辑时的联系人
selectedContact2: null, // 编辑时的联系人
selectedContact3: null, // 编辑时的联系人
selectedMailContact: null, // 编辑时的邮寄联系人
projectId: null,
projectList: [],
disabledCompany: false, // 企业是否禁用
url: {
add: '/SafetyCenterSubitem/add',
edit: '/SafetyCenterSubitem/edit'
},
// 成员单位列表(只能选上级选过的)
companyList: '/company/payCompanyManagement/listSafetyCenter',
// 需要带上当前项目id
customListParams: {
projectId: this.$route.query.projectId
},
// 默认的联系人数据
defaultPayWorkingGroupSubItemContact: {
contactsId: undefined,
remarks: null,
name: null
}
}
},
methods: {
addZero,
getContactsByCompanyBySafetyCenter,
add() {
this.edit({})
},
/**
* 获取当前年功能安全中心列表
*/
loadCurrentYearProjectList() {
getAllDraftProjects({
year: new Date().getFullYear(),
column: 'createTime',
order: 'desc'
}).then(res => {
if (res.success) {
this.projectList = res.result
} else {
this.$message.warn(res.message)
}
})
},
edit(record) {
// 回显
record.chargeCompany = {
id: record.companyId,
companyName: record.companyId_dictText
}
// 回显选中的企业
this.selectedCompany = record.chargeCompany
this.companyChange(this.selectedCompany)
this.form.resetFields()
this.model = Object.assign({}, JSON.parse(JSON.stringify(record)))
if (this.model.id) {
// 传给组件的init-contact值,需要id和name两个属性
this.model.contactsList && this.model.contactsList.forEach(item => {
item.name = item.contactsTemporaryName
})
} else {
// 新增处理默认显示的三个企业联系人
this.model.contactsList = []
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
}
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'chargeCompany', 'remarks', 'contactsList'))
})
},
close() {
this.$emit('close')
this.selectedCompany = null
// 清除选中联系人信息
this.selectedContact1 = null
this.selectedContact2 = null
this.selectedContact3 = null
this.selectedMailContact = null
this.disabledCompany = false
this.visible = false
this.model = Object.assign({}, {})
this.form.resetFields()
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
// values.chargeCompanyTemporaryName = values.chargeCompany.companyName
values.companyId = values.chargeCompany.id
let httpurl = ''
let method = 'post'
if (!this.model.id) {
httpurl += this.url.add
} else {
httpurl += this.url.edit
}
if (this.projectId) {
values.projectId = this.projectId
}
// 企业联系人信息中将没有值的去掉
let haveValueContactArr = values.contactsList.filter(tt => tt.contactsId)
let obj = {
contactsList: haveValueContactArr
}
const formData = Object.assign(this.model, values, obj)
console.log('表单提交数据', formData)
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
/**
* 选中企业变化,将联系人的值清空
* @param value
*/
companyChange(value) {
// 当前选中的企业和之前选中的企业一致,就不修改了
if (this.selectedCompany && value && this.selectedCompany.id === value.id) {
return
}
this.selectedCompany = value
// 处理默认显示的三个企业联系人
this.model.contactsList = []
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
this.model.contactsList.push(this.defaultPayWorkingGroupSubItemContact)
this.selectedMailContact = null
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'contactsList'))
})
},
/**
* 企业必填校验
* @param rules
* @param value
* @param callback
*/
checkCompany(rules, value, callback) {
if (value.id && value.companyName) {
callback()
return
}
callback('请选择成员单位')
},
/**
* 在新增成功后重新获取联系人列表
*/
addContactsOneOk() {
this.$refs.selectMailContacts.getContactsList()
},
addMailContactsOk() {
this.$refs.selectContacts1.getContactsList()
this.$refs.selectContacts2.getContactsList()
this.$refs.selectContacts3.getContactsList()
},
validateContactRequired(rule, value, callback) {
if (value) {
callback()
}
callback('请选择企业联系人1')
},
/**
* 校验企业联系人是否重复
* @param rule
* @param value
* @param callback
*/
validateContact(rule, value, callback) {
if (value) {
let contactsList = this.form.getFieldValue('contactsList')
let hasValueArr = contactsList.filter(tt => tt.contactsId === value)
if (hasValueArr.length <= 1) {
callback()
}
callback('请选择不同的联系人')
return
}
callback()
},
/**
* 添加联系人
* @param index
*/
handleAddContact(index) {
if (this.model.contactsList.length >= 20) {
this.$message.warn('最多添加二十个企业联系人')
return
}
let obj = {
contactsId: undefined,
remarks: null
}
this.model.contactsList.splice(index + 1, 0, obj)
this.$forceUpdate()
let formData = this.form.getFieldValue('contactsList')
formData.splice(index + 1, 0, obj)
this.$nextTick(() => {
this.form.setFieldsValue({ contactsList: formData })
})
},
/**
* 删除联系人
* @param index
*/
handleDelContact(index) {
if (this.model.contactsList.length === 1) {
this.$message.warn('最少需要一个企业联系人')
return
}
this.model.contactsList.splice(index, 1)
let formData = this.form.getFieldValue('contactsList')
formData.splice(index, 1)
this.$nextTick(() => {
this.form.setFieldsValue({ contactsList: formData })
})
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
}
}
}
</script>
<style scoped lang="less">
.charge-notice-no {
width: 100%;
/deep/ .ant-radio-wrapper {
display: inline-block;
width: 100%;
span.ant-radio + * {
display: inline-block;
width: 100%;
span {
vertical-align: bottom;
display: inline-block;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
}
.contact-btn {
display: inline-block;
margin: 0 8px;
padding: 0;
height: 40px;
}
.del-btn {
color: #ff4d4f
}
// 工作组选择对齐其他表单的样式
.custom-col {
/deep/ .ant-col-sm-4 {
width: calc(100% / 24 * 4.5);
}
/deep/ .ant-col-sm-20 {
width: calc(100% / 24 * 19.5);
}
}
</style>
@@ -0,0 +1,218 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-row>
<a-col :span="24">
<a-form-item label="项目名称" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-input placeholder="请输入项目名称"
v-decorator="['projectName',validatorRules.projectName]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
<a-form-item label="负责人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-principal placeholder="请选择负责人"
v-decorator="['principalId',validatorRules.principalId]"
:maxLength='50'></select-principal>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col>
<a-form-item label="任务及目标" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入任务及目标"
:auto-size="{ minRows: 3, maxRows: 6 }"
v-decorator="['missionAndObjectives']"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col>
<a-form-item label="备注" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入备注"
:auto-size="{ minRows: 3, maxRows: 6 }"
v-decorator="['remarks']"
:maxLength='200'
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { httpAction } from '@api/manage'
import SelectPrincipal from '@comp/company/SelectPrincipal'
import { addZero } from '@/utils/util'
import {SafetyCenterProjectTypeEnums} from '@/enums/commonEnums'
export default {
name: 'SafetyCenterModule',
components: { SelectPrincipal },
data() {
return {
title: '操作',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 }
},
remarksLabelCol: {
xs: { span: 24 },
sm: { span: 3 }
},
remarksWrapperCol: {
xs: { span: 24 },
sm: { span: 21 }
},
validatorRules: {
projectName: {
rules: [{ required: true, message: '请输入项目名称' }],
validateTrigger: 'blur'
},
year: {
rules: [{ required: true, message: '请选择运行年份' }],
validateTrigger: 'change'
},
principalId: {
rules: [{ required: true, message: '请选择负责人' }],
validateTrigger: 'change'
},
checkMoney: {
rules: [{ required: false, validator: this.checkMoney }],
validateTrigger: 'blur'
}
},
// 研究组的接口
url: {
add: '/SafetyCenter/add',
edit: '/SafetyCenter/edit'
},
// 项目组的接口
projectUrl: {
add: '/SafetyCenter/addProjectGroup',
edit: '/SafetyCenter/editProjectGroup'
},
// 项目类型,默认是研究组
projectType: SafetyCenterProjectTypeEnums.studyGroup.value
}
},
methods: {
addZero,
add() {
this.edit({})
},
edit(record) {
// 有id就是项目组
if (this.$route.query.id) {
this.projectType = SafetyCenterProjectTypeEnums.projectGroup.value
} else {
this.projectType = SafetyCenterProjectTypeEnums.studyGroup.value
}
this.form.resetFields()
// 防止下拉选项出现问题
record.principalId = record.principalId || undefined
this.model = Object.assign({}, record)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model,
'projectName',
'principalId',
'missionAndObjectives',
'remarks'
))
})
},
close() {
this.$emit('close')
this.visible = false
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let httpurl = ''
let method = 'post'
// 研究组用url,项目组用projectUrl
const urlObj = this.projectType === SafetyCenterProjectTypeEnums.studyGroup.value ? this.url : this.projectUrl
if (!this.model.id) {
httpurl += urlObj.add
} else {
httpurl += urlObj.edit
}
const formData = Object.assign(this.model, values)
formData.parentId = this.$route.query.id
console.log('表单提交数据', formData)
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
},
handleCancel() {
this.close()
},
}
}
</script>
<style scoped lang="less">
.prompt-message {
color: red;
&-line2 {
padding-left: 2.7rem;
}
}
</style>
@@ -176,7 +176,7 @@
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="会议通知" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-upload :return-id="true" v-decorator="[ 'meetingFiles',validatorRules.meetingFiles]"></j-upload>
<j-upload :return-id="true" :multiple="true" v-decorator="[ 'meetingFiles',validatorRules.meetingFiles]"></j-upload>
</a-form-item>
</a-col>
</a-row>
@@ -404,12 +404,12 @@
<template v-if="!isWasic">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="会议费用" :labelCol="labelCol" :wrapperCol="{ xs: {span: 24},sm: {span: 16}}">
<!-- 起草组会议费用默认0不可修改 -->
<!-- 起草组会议、海外会议、功能安全中心会议费用默认0不可修改 -->
<a-input placeholder="请输入会议费用"
:maxLength='50'
@change="(e) => {e.target.value = e.target.value.replace(/[^0-9.]/g,'')}"
@blur="addZero"
:disabled="meetingType === '7'"
:disabled="disabledMeetingCosts"
v-decorator="[ 'meetingCosts',validateInviteCode.meetingCosts]"></a-input>
<span class="yuan">元/人</span>
</a-form-item>
@@ -630,7 +630,7 @@ import JImageUpload from '@comp/jero/JImageUpload'
import {checkMeetingName} from '@/utils/validateOnly'
import {addZero} from '@/utils/util'
import {money, phoneReg} from '@/utils/validate'
import { LinkTopicsEnums } from '../../../enums/commonEnums'
import {LinkTopicsEnums, MeetingTypeEnums} from '../../../enums/commonEnums'
export default {
@@ -763,6 +763,16 @@ export default {
}
},
computed: {
// 禁用会议费用
disabledMeetingCosts () {
// 禁用的会议类型
const arr = [
MeetingTypeEnums.draftGroup.value, // 起草组会议
MeetingTypeEnums.overseas.value, // 海外会议
MeetingTypeEnums.safetyCenter.value, // 功能安全中心会议
]
return arr.includes(this.meetingType)
},
// 是否从工作组会议维护来的
isWorkGroupMeetType() {
if (this.$route.query.workingGroupProjectId) {
@@ -802,6 +812,14 @@ export default {
} else {
return false
}
},
// 是否功能安全中心来的
isSafetyCenterId() {
if (this.$route.query.safetyCenterId) {
return true
} else {
return false
}
}
},
mounted() {
@@ -922,8 +940,13 @@ export default {
// 后端需要的注册签到时间
this.newSignInTime = [this.model.startSignInTime, this.model.endSignInTime]
// 起草组会议费用默认0
if (this.meetingType === '7') {
// 部分会议费用默认0
const zeroCostscArr = [
MeetingTypeEnums.draftGroup.value, // 起草组会议
MeetingTypeEnums.overseas.value, // 海外会议
MeetingTypeEnums.safetyCenter.value, // 功能安全中心会议
]
if (zeroCostscArr.includes(this.meetingType)) {
this.model.meetingCosts = '0.00'
this.QRcodeBool = false
}
@@ -1039,6 +1062,11 @@ export default {
formData.meetingType = '7'
formData.draftingGroupId = this.$route.query.draftingGroupProjectId
}
// 如果是 功能安全中心 来的加上id和会议类型
if (this.isSafetyCenterId) {
formData.meetingType = MeetingTypeEnums.safetyCenter.value
formData.safetyCenterId = this.$route.query.safetyCenterId
}
// 转换召开时间
formData.startTime = this.newConvokeTime[0]
formData.endTime = this.newConvokeTime[1]
@@ -1187,7 +1215,8 @@ export default {
* 添加会议联系人
* */
addMeetingContacts(index) {
if (this.model.meetingContactsList.length >= 5) {
// 国际研讨会不限制5个会议联系人
if ((this.meetingType !== MeetingTypeEnums.internationalSeminar.value) && (this.model.meetingContactsList.length >= 5)) {
this.$message.warning('最多添加5个会议联系人')
return
}
@@ -1400,6 +1429,18 @@ export default {
add: '/meeting/draftGroupMeeting/add',
edit: '/meeting/draftGroupMeeting/edit'
}
// 海外会议
case MeetingTypeEnums.overseas.value:
return {
add: '/meeting/overseas/add',
edit: '/meeting/overseas/edit'
}
// 功能安全中心会议
case MeetingTypeEnums.safetyCenter.value:
return {
add: '/meeting/safetyCenterMeeting/add',
edit: '/meeting/safetyCenterMeeting/edit'
}
}
},
/*
@@ -157,7 +157,8 @@
<label>报名二维码</label><img class="qr-code" :src="signUpQRCode" alt="报名二维码"/><i class="copy primary-color"
@click="copy(showSignUpHref)">复制</i>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<!--海外会议没有签到-->
<a-col :xxl="8" :xl="12" :sm="24" v-if="!isOverseasMeeting">
<label>签到二维码</label><img class="qr-code" :src="signInQRCode" alt="签到二维码"/>
<!-- <i class="copy primary-color" @click="copy(signInUrl)">复制</i>-->
</a-col>
@@ -174,7 +175,7 @@
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-row :gutter="24" v-if="!isOverseasMeeting">
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="参会单位">
<a-input placeholder="请输入参会单位" v-model="queryParam.companyName" :maxLength='50'></a-input>
@@ -185,8 +186,8 @@
<a-input placeholder="请输入参会人" v-model="queryParam.companyContactName" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<!-- 功能安全中心不显示审核 -->
<a-col :xl="6" :lg="7" :md="8" :sm="24" v-if="currentMeetingInfo.meetingType !== MeetingTypeEnums.safetyCenter.value">
<a-form-item label="审核">
<j-dict-select-tag v-model="queryParam.checkResult" placeholder="请选择"
dictCode="signup_status"/>
@@ -207,7 +208,7 @@
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-col :xl="6" :lg="7" :md="8" :sm="24" v-if="!isSafetyCenter">
<a-form-item label="来款年份">
<j-year-date style="width:100%" placeholder="请选择来款年份" v-model="queryParam.particularYear"></j-year-date>
</a-form-item>
@@ -226,29 +227,30 @@
dictCode="guest_type"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否打包">
<j-dict-select-tag v-model="queryParam.pack" placeholder="请选择是否打包" @input="selectIdentity"
dictCode="yn"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
<a-form-item label="缴费方式">
<j-dict-select-tag
v-model="queryParam.payMode"
placeholder="请选择缴费方式"
dictCode="meeting_pay_type"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
<a-form-item label="发票项目">
<j-dict-select-tag
v-model="queryParam.invoiceProject"
placeholder="请选择发票项目"
dictCode="invoice_project"/>
</a-form-item>
</a-col>
<template v-if="!isSafetyCenter">
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否打包">
<j-dict-select-tag v-model="queryParam.pack" placeholder="请选择是否打包" @input="selectIdentity"
dictCode="yn"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
<a-form-item label="缴费方式">
<j-dict-select-tag
v-model="queryParam.payMode"
placeholder="请选择缴费方式"
dictCode="meeting_pay_type"/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
<a-form-item label="发票项目">
<j-dict-select-tag
v-model="queryParam.invoiceProject"
placeholder="请选择发票项目"
dictCode="invoice_project"/>
</a-form-item>
</a-col>
</template>
<!-- 国际研讨会 且为 WASIC时显示 -->
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero" v-if="currentMeetingInfo.meetingType === '3' && currentMeetingInfo.isWasic">
<a-form-item label="会议名称">
@@ -273,6 +275,56 @@
</span>
</a-col>
</a-row>
<!-- 海外会议 -->
<a-row :gutter="24" v-else>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="姓名">
<a-input placeholder="请输入姓名" v-model="queryParam.name" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="性别">
<a-input placeholder="请输入性别" v-model="queryParam.sex" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="国籍">
<a-input placeholder="请输入国籍" v-model="queryParam.nationality" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="单位">
<a-input placeholder="请输入单位" v-model="queryParam.unit" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="职务">
<a-input placeholder="请输入职务" v-model="queryParam.post" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="地址">
<a-input placeholder="请输入地址" v-model="queryParam.address" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="邮箱">
<a-input placeholder="请输入邮箱" v-model="queryParam.email" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="联系电话">
<a-input placeholder="请输入联系电话" v-model="queryParam.phone" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search"
v-has:[authorCode.search]="'attendance:search'">查询</a-button>
<a-button @click="searchReset" icon="reload" class="reset-button" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
@@ -292,6 +344,10 @@
<a-button type="primary" @click="batchSetGuestsUploadFileFlag" v-has:[authorCode.guestsUploadFileFlag]="'attendance:guestsUploadFileFlag'">
批量设置资料状态
</a-button>
<!--20240703 只有工作组和起草组会议列表页上方新增一个批量审核按钮-->
<a-button type="primary" @click="batchAuditSignUpFlag" v-if="meetingTypeValue + '' === MeetingTypeEnums.workGroup.value || meetingTypeValue + '' === MeetingTypeEnums.draftGroup.value" v-has:[authorCode.batchAuditSignUpInfo]="'attendance:batchAuditSignUpInfo'">
批量审核报名信息
</a-button>
<!--当会议费用为0不需要合并开票 -->
<!-- 变更将此功能添加到到账开票了 暂时注释 2021-09-16 -->
<!-- <a-button type="primary" @click="batchInvoice" v-show="currentMeetingInfo.meetingCosts !== 0">合并开票</a-button>-->
@@ -384,9 +440,11 @@
<!-- 只有缴费方式为汇款并且上传了汇款凭证的的才会有审核按钮 审核报名信息通过后才能审核凭证 审核通过后不显示 审核凭证按钮 -->
<a @click="handleAudit(record)" v-if="(record.payMode === 1 || record.payMode === 2 ) && record.paymentRecord && record.checkResult !== 1"
v-has:[authorCode.auditRecord]="'attendance:auditCredentials'">审核凭证</a>
<!-- 只有工作组会议与分标委会议理事会会议起草组会议 才有审核报名信息-->
<!-- v-has:[authorCode.lookVoucher]="'attendance:lookVoucher'"-->
<a @click="lookVoucher(record)" v-show="(record.payMode === 1 || record.payMode === 2 ) && record.paymentRecord" v-has:[authorCode.lookVoucher]="'attendance:lookVoucher'">查看凭证</a>
<!-- 只有工作组会议与分标委会议理事会会议起草组会议功能安全中心 才有审核报名信息-->
<a @click="handleAuditSignUp(record)"
v-show="(['1', '5', '6', '7'].includes(currentMeetingInfo.meetingType)) && record.registerCheckResult === 0 "
v-show="(['1', '5', '6', '7', MeetingTypeEnums.safetyCenter.value].includes(currentMeetingInfo.meetingType)) && record.registerCheckResult === 0 "
v-has:[authorCode.auditSignUpInfo]="'attendance:auditSignUp'">审核报名信息</a>
<!-- 非成员报名被拒绝 无法编辑 -->
<a @click="handleEdit(record)" v-if="record.registerCheckResult !== 2" v-has:[authorCode.edit]="'attendance:edit'">编辑</a>
@@ -408,8 +466,8 @@
<!--设置对接人-->
<batch-set-docker-modal ref="batchSetDockerModal" @ok="modalFormOk"></batch-set-docker-modal>
<!--详情-->
<project-detail-modal ref="projectDetailModal"></project-detail-modal>
<!--审核-->
<project-detail-modal ref="projectDetailModal" :meeting-type="currentMeetingInfo.meetingType"></project-detail-modal>
<!--审核审核凭证审核报名信息查看凭证-->
<audit-modal ref="auditModal" @ok="modalFormOk"></audit-modal>
<!--设置资料状态--即嘉宾是否可以在企业端上传资料-->
<set-guess-upload-flag-modal ref="setGuessUploadFlagModal" :meeting-id="meetingId" :meeting-type="meetingTypeValue" @ok="modalFormOk"></set-guess-upload-flag-modal>
@@ -437,6 +495,8 @@ import { downloadFile } from '../../../api/manage'
import WasicTopicData from './modules/wasicStaticData'
import { formatMoney } from '@/utils/formatMoney'
import {getPayConfirmList} from '@api/incomePaymentsApi'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
@@ -458,6 +518,7 @@ export default {
},
data() {
return {
MeetingTypeEnums,
description: '参会情况',
columns: [
{
@@ -570,6 +631,123 @@ export default {
scopedSlots: { customRender: 'action' }
}
],
// 功能安全中心表格
safetyCenterColumns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '参会单位',
align: 'center',
dataIndex: 'companyName',
scopedSlots: { customRender: 'htmlSlot' },
},
{
title: '参会人员',
align: 'center',
dataIndex: 'companyContactName',
width: 160,
scopedSlots: { customRender: 'person' }
},
{
title: '是否签到',
align: 'center',
dataIndex: 'checkIn_dictText',
width: 80
},
{
title: '身份',
align: 'center',
dataIndex: 'identity_dictText',
width: 80
},
{
title: '对接人',
align: 'center',
dataIndex: 'dockName'
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 300,
scopedSlots: { customRender: 'action' }
}
],
// 海外会议表格
overseasMeetingColumns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '姓名',
align: 'center',
dataIndex: 'name',
width: 100
},
{
title: '性别',
align: 'center',
dataIndex: 'sex',
width: 100
},
{
title: '国籍',
align: 'center',
dataIndex: 'nationality',
width: 100
},
{
title: '单位',
align: 'center',
dataIndex: 'unit',
width: 200
},
{
title: '职务',
align: 'center',
dataIndex: 'post',
width: 200
},
{
title: '地址',
align: 'center',
dataIndex: 'address',
},
{
title: '邮箱',
align: 'center',
dataIndex: 'email',
width: 200
},
{
title: '联系电话',
align: 'center',
dataIndex: 'phone',
width: 120
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 300,
scopedSlots: { customRender: 'action' }
}
],
// 权限编码
authorCode: {},
// 其他会议的参会情况的权限编码
@@ -582,7 +760,9 @@ export default {
delete: 'otherMeetingSituation:delete',
auditRecord: 'otherMeetingSituation:auditCredentials',
auditSignUpInfo: 'otherMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'otherMeetingSituation:guestsUploadFileFlag'
guestsUploadFileFlag: 'otherMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'otherMeetingSituation:lookVoucher' // 查看凭证
},
// 分标委会议的参会情况权限编码
committeeMeetingCode: {
@@ -594,7 +774,8 @@ export default {
delete: 'committeeMeetingSituation:delete',
auditRecord: 'committeeMeetingSituation:auditCredentials',
auditSignUpInfo: 'committeeMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'committeeMeetingSituation:guestsUploadFileFlag'
guestsUploadFileFlag: 'committeeMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'committeeMeetingSituation:lookVoucher' // 查看凭证
},
// 工作组会议的参会情况的权限编码
workGroupMeetingCode: {
@@ -606,7 +787,9 @@ export default {
delete: 'workGroupMeetingSituation:delete',
auditRecord: 'workGroupMeetingSituation:auditCredentials',
auditSignUpInfo: 'workGroupMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'workGroupMeetingSituation:guestsUploadFileFlag'
batchAuditSignUpInfo: 'workGroupMeetingSituation:batchAuditSignUp', // 批量审核报名信息
guestsUploadFileFlag: 'workGroupMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'workGroupMeetingSituation:lookVoucher' // 查看凭证
},
// 国际研讨会的参会情况的权限编码
internalMeetingCode: {
@@ -618,7 +801,8 @@ export default {
delete: 'internalMeetingSituation:delete',
auditRecord: 'internalMeetingSituation:auditCredentials',
auditSignUpInfo: 'internalMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'internalMeetingSituation:guestsUploadFileFlag'
guestsUploadFileFlag: 'internalMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'internalMeetingSituation:lookVoucher' // 查看凭证
},
// 标协会议的参会情况的权限编码
standardsMeetingCode: {
@@ -630,7 +814,8 @@ export default {
delete: 'standardsMeetingSituation:delete',
auditRecord: 'standardsMeetingSituation:auditCredentials',
auditSignUpInfo: 'standardsMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'standardsMeetingSituation:guestsUploadFileFlag'
guestsUploadFileFlag: 'standardsMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'standardsMeetingSituation:lookVoucher' // 查看凭证
},
// 理事会的参会情况的权限编码
councilMeetingCode: {
@@ -642,7 +827,8 @@ export default {
delete: 'councilMeetingSituation:delete',
auditRecord: 'councilMeetingSituation:auditCredentials',
auditSignUpInfo: 'councilMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'councilMeetingSituation:guestsUploadFileFlag'
guestsUploadFileFlag: 'councilMeetingSituation:guestsUploadFileFlag',
lookVoucher: 'councilMeetingSituation:lookVoucher' // 查看凭证
},
// 起草组会议的参会情况的权限编码
draftGroupMeetingCode: {
@@ -654,8 +840,33 @@ export default {
delete: 'draftGroupMeetingSituation:delete',
auditRecord: 'draftGroupMeetingSituation:auditCredentials',
auditSignUpInfo: 'draftGroupMeetingSituation:auditSignUp',
batchAuditSignUpInfo: 'draftGroupMeetingSituation:batchAuditSignUp', // 批量审核报名信息
guestsUploadFileFlag: 'draftGroupMeetingSituation:guestsUploadFileFlag'
},
// 海外会议的参会情况的权限编码
overseasMeetingCode: {
search: 'overseasMeetingSituation:search',
add: 'overseasMeetingSituation:add',
export: 'overseasMeetingSituation:export',
batchDel: 'overseasMeetingSituation:batchDel',
edit: 'overseasMeetingSituation:edit',
delete: 'overseasMeetingSituation:delete',
auditRecord: 'overseasMeetingSituation:auditCredentials',
auditSignUpInfo: 'overseasMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'overseasMeetingSituation:guestsUploadFileFlag'
},
// 功能安全中心会议的参会情况的权限编码
safetyCenterMeetingCode: {
search: 'safetyCenterMeetingSituation:search',
add: 'safetyCenterMeetingSituation:add',
export: 'safetyCenterMeetingSituation:export',
batchDel: 'safetyCenterMeetingSituation:batchDel',
edit: 'safetyCenterMeetingSituation:edit',
delete: 'safetyCenterMeetingSituation:delete',
auditRecord: 'safetyCenterMeetingSituation:auditCredentials',
auditSignUpInfo: 'safetyCenterMeetingSituation:auditSignUp',
guestsUploadFileFlag: 'safetyCenterMeetingSituation:guestsUploadFileFlag'
},
disableMixinCreated: true,
// url: {
// list: '/meeting/payMeetingSituation/page',
@@ -720,6 +931,22 @@ export default {
exportXlsUrl: '/meeting/draftGroupMeetingSituation/exportXls',
importExcelUrl: '/meeting/draftGroupMeetingSituation/importExcel'
},
// 海外会议的url
overseasMeetingUrl: {
list: '/meeting/overseasSituation/page',
delete: '/meeting/overseasSituation/delete',
deleteBatch: '/meeting/overseasSituation/deleteBatch',
exportXlsUrl: '/meeting/overseasSituation/exportXls',
importExcelUrl: '/meeting/overseasSituation/importExcel'
},
// 功能安全中心会议的url
safetyCenterMeetingUrl: {
list: '/meeting/safetyCenterMeetingSituation/page',
delete: '/meeting/safetyCenterMeetingSituation/delete',
deleteBatch: '/meeting/safetyCenterMeetingSituation/deleteBatch',
exportXlsUrl: '/meeting/safetyCenterMeetingSituation/exportXls',
importExcelUrl: '/meeting/safetyCenterMeetingSituation/importExcel'
},
// 当前的会议信息详情
currentMeetingInfo: {},
meetingType: '',
@@ -739,6 +966,14 @@ export default {
},
created() {
// console.log(this.$route,'this.$route this.$route')
// 海外会议处理表格
if (this.isOverseasMeeting) {
this.columns = this.overseasMeetingColumns
}
// 功能安全中心表格
if (this.isSafetyCenter) {
this.columns = this.safetyCenterColumns
}
// 为不同会议的参会情况去设置不同的权限编码
this.setCodeByMeetingType(this.$route.query.meetingType)
// 获取会议详情
@@ -755,7 +990,9 @@ export default {
// 列表表头只有国际研讨会有对接人字段
if (this.currentMeetingInfo.meetingType !== '3') {
let index = this.columns.findIndex(item => item.dataIndex === 'dockName')
this.columns.splice(index, 1)
if (index !== -1) {
this.columns.splice(index, 1)
}
}
// 计算会议费用 会议费用为0 添加参会人不显示邮寄信息与缴费信息 标协会议
if (this.currentMeetingInfo.meetingType === '2' && this.currentMeetingInfo.meetingCostsVip) {
@@ -802,6 +1039,14 @@ export default {
this.signInQRCode = await this.generateQRCode(this.signInUrl)
},
computed: {
// 是否功能安全中心
isSafetyCenter() {
return this.$route.query.meetingType === MeetingTypeEnums.safetyCenter.value
},
// 是否海外会议
isOverseasMeeting () {
return this.$route.query.meetingType === MeetingTypeEnums.overseas.value
},
// 标协会议类型
tbMeetingType() {
if (this.currentMeetingInfo.tbMeetingType === '1') {
@@ -832,6 +1077,12 @@ export default {
return this.councilMeetingUrl
case '7':
return this.draftGroupMeetingUrl
// 海外会议
case MeetingTypeEnums.overseas.value:
return this.overseasMeetingUrl
// 功能安全中心会议
case MeetingTypeEnums.safetyCenter.value:
return this.safetyCenterMeetingUrl
// 为了解决控制台报错写的
default:return this.workGroupMeetingUrl
}
@@ -917,8 +1168,10 @@ export default {
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param['selections'] = this.selectedRowKeys.join(',')
}
// 增加特有的企业名称排序
param.column = 'companyName'
// 增加特有的企业名称排序,海外会议按创建时间
if (!this.isOverseasMeeting) {
param.column = 'companyName'
}
downloadFile(this.url.exportXlsUrl, fileName + '.xlsx', param)
},
/*
@@ -932,12 +1185,18 @@ export default {
* 添加参会人
* */
addParticipant() {
let path = '/incomePayments/meetManage/SignUpInfoEdit'
// 海外会议跳转另一个页面
if (this.isOverseasMeeting) {
path = '/incomePayments/meetManage/SignUpInfoEditOverseas'
}
this.$router.push({
path: '/incomePayments/meetManage/SignUpInfoEdit',
path,
query: {
meetingType: this.currentMeetingInfo.meetingType,
meetingId: this.$route.query.id,
costBool: this.meetingCostBool
costBool: this.meetingCostBool,
safetyCenterId: this.currentMeetingInfo.safetyCenterId
}
})
},
@@ -945,13 +1204,19 @@ export default {
* 编辑参会人
* */
handleEdit(record) {
let path = '/incomePayments/meetManage/SignUpInfoEdit'
// 海外会议跳转另一个页面
if (this.isOverseasMeeting) {
path = '/incomePayments/meetManage/SignUpInfoEditOverseas'
}
this.$router.push({
path: '/incomePayments/meetManage/SignUpInfoEdit',
path,
query: {
id: record.id,
meetingId: this.$route.query.id,
meetingType: this.currentMeetingInfo.meetingType,
costBool: this.meetingCostBool
costBool: this.meetingCostBool,
safetyCenterId: this.currentMeetingInfo.safetyCenterId
}
})
},
@@ -1036,6 +1301,11 @@ export default {
return '理事会会议'
case '7':
return '起草组会议'
case MeetingTypeEnums.overseas.value:
return '海外会议'
// 功能安全中心会议
case MeetingTypeEnums.safetyCenter.value:
return MeetingTypeEnums.safetyCenter.name
default:
return '其他会议'
}
@@ -1138,8 +1408,49 @@ export default {
case '7':
this.authorCode = Object.assign({}, this.draftGroupMeetingCode)
break
// 海外会议
case MeetingTypeEnums.overseas.value:
this.authorCode = Object.assign({}, this.overseasMeetingCode)
break
// 功能安全中心会议
case MeetingTypeEnums.safetyCenter.value:
this.authorCode = Object.assign({}, this.safetyCenterMeetingCode)
break
}
}
},
// 批量审核报名信息,只有参会方式是嘉宾的可以设置
// record.registerCheckResult === 0 的时候有审核信息
batchAuditSignUpFlag() {
console.log(1)
if (this.selectedRowKeys.length <= 0) {
this.$message.warning('请选择一条记录!')
return
}
// 判断record.registerCheckResult === 0 的时候有审核信息
let flag = this.selectionRows.some(item => {
return item.registerCheckResult !== 0
})
if(flag) {
this.$message.warn('只有待审核信息才可批量审核报名信息')
return
}
const that = this
let ids = this.selectedRowKeys.join(',')
this.$confirm({
title: '确认审核',
content: '是否确定批量审核报名信息?',
onOk: function () {
that.$refs.auditModal.title = '批量审核报名信息'
that.$refs.auditModal.open({ batch: true, ids }, true)
}
})
},
// 查看凭证
lookVoucher(record) {
this.$refs.auditModal.title = '查看凭证'
this.$refs.auditModal.lookVoucher(record)
},
}
}
@@ -26,9 +26,9 @@
</a-form-item>
</a-col>
</a-row>
<!-- 只有编辑的时候并且缴费方式不是打包 显示 待确收金额 税率 税额 等信息 -->
<template v-if="!!$route.query.id && identifyType === 2 && !payModeBool">
<!-- 只有编辑的时候并且缴费方式不是打包 显示 待确收金额 税率 税额 等信息 !!$route.query.id && identifyType === 2 && !payModeBool -->
<!--20240801 修改-缴费方式为 打包的时候也要待确收金额-->
<template v-if="!!$route.query.id && identifyType === 2">
<!-- 到账后 待确收金额 税率不能编辑 -->
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
@@ -28,28 +28,28 @@
<!--个人信息end-->
<!-- 不是国际研讨会的 -->
<div v-if="meetingType !== '3' ">
<!-- 功能安全中心不显示其他信息 -->
<div v-if="(meetingType !== '3') && (meetingType !== MeetingTypeEnums.safetyCenter.value)">
<!--行程信息begin-->
<template>
<div class="item-title">行程信息</div>
<a-row :gutter="24" class="flex-col">
<a-col :xxl="8" :xl="12" :sm="24">
<label class="label">是否住酒店</label><span>{{ model.checkInHotel_dictText }}</span>
</a-col>
<!-- 抵达时间和离开时间 填写了才显示 -->
<a-col :xxl="8" :xl="12" :sm="24" v-if="!!model.arrivalTime">
<label class="label">抵达时间</label><span>{{ model.arrivalTime }}</span>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" v-if="!!model.departureTime">
<label class="label">离开时间</label><span>{{ model.departureTime }}</span>
</a-col>
</a-row>
</template>
<div class="item-title">行程信息</div>
<a-row :gutter="24" class="flex-col">
<a-col :xxl="8" :xl="12" :sm="24">
<label class="label">是否住酒店</label><span>{{ model.checkInHotel_dictText }}</span>
</a-col>
<!-- 抵达时间和离开时间 填写了才显示 -->
<a-col :xxl="8" :xl="12" :sm="24" v-if="!!model.arrivalTime">
<label class="label">抵达时间</label><span>{{ model.arrivalTime }}</span>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" v-if="!!model.departureTime">
<label class="label">离开时间</label><span>{{ model.departureTime }}</span>
</a-col>
</a-row>
<!--行程信息end-->
<!--其他会议的身份选择参会人才显示 缴费信息和邮寄信息 -->
<!--缴费信息begin-->
<template v-if="model.identity === 2">
<!-- 功能安全中心不显示缴费信息 -->
<template v-if="(model.identity === 2)">
<div class="item-title">缴费信息</div>
<a-row :gutter="24" class="flex-col">
<a-col :xxl="8" :xl="12" :sm="24">
@@ -270,6 +270,7 @@ import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import {getSingUpUserInfo} from '@api/incomeMeetingApi'
import JImageUpload from '@comp/jero/JImageUpload'
import PreviewFile from '@comp/jero/PreviewFile'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
@@ -293,6 +294,7 @@ export default {
},
data() {
return {
MeetingTypeEnums,
model: {}, // 会议信息
meetingType: '' // 会议类型
}
@@ -12,21 +12,26 @@
<add-meeting-company @change="changeCompany" v-decorator="['companyId',validatorRules.companyId]"
placeholder="请选择参会企业"
full-company-info
:customListUrl="safetyCenterId ? companyList : ''"
:customListParams="safetyCenterId ? customListParams : {}"
:disabled="model.checkResult === 1"
:maxLength='50'>
</add-meeting-company>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-row :gutter="24" type="flex">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
<select-contacts :selected-company="selectedCompany"
placeholder="请选择参会人"
v-decorator="['companyContactId',validatorRules.companyContactId]"
:maxLength='50'
:can-add="!safetyCenterId"
:disabled="model.checkResult === 1"
:init-contacts="selectPerson"
:customListFn="safetyCenterId ? getContactsByCompanyBySafetyCenter : null"
:customListParams="safetyCenterId ? customListParams : {}"
@change="changeContact"
ref="selectMailContacts"
@ok="addContactsOk"></select-contacts>
@@ -42,6 +47,15 @@
</a-form-item>
</a-col>
<!--国际研讨会-职务-->
<a-col :xxl="8" :xl="12" :sm="24" v-if="meetingType === MeetingTypeEnums.internationalSeminar.value ">
<a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入职务"
:maxLength='50'
v-decorator="['post',validatorRules.post]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="身份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<!--内部企业的时候不允许进行修改参会身份-->
@@ -144,7 +158,6 @@
</a-form-item>
</a-col>
</a-row>
<div class="center">
<a-button class="submit" type="primary" @click="handleOk" v-preventclick>确定</a-button>
<a-button @click="handleCancel">取消</a-button>
@@ -162,14 +175,14 @@ import OtherMeetingForm from '@views/incomePayments/meetManage/OtherMeetingForm'
import SeminarVipForm from '@views/incomePayments/meetManage/modules/SeminarVipForm'
import SeminarPartnerForm from '@views/incomePayments/meetManage/modules/SeminarPartnerForm'
import AddMeetingCompany from '@comp/company/AddMeetingCompany'
import {getContactsById} from '@api/api'
import {getContactsByCompanyBySafetyCenter, getContactsById} from '@api/api'
import {getSingUpUserInfo, validateStandard, getMeetInfoById, getLinkTopics} from '@api/incomeMeetingApi'
import {judgeCompanyIsPackaged, judgeInternalEnterprise} from '../../../api/incomePaymentsApi'
import {httpAction} from '@api/manage'
import pick from 'lodash.pick'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import { queryCompanyInfoById } from '../../../api/api'
import { LinkTopicsEnums } from '../../../enums/commonEnums'
import {LinkTopicsEnums, MeetingTypeEnums} from '../../../enums/commonEnums'
import WasicTopicData from './modules/wasicStaticData'
export default {
@@ -185,6 +198,7 @@ export default {
},
data() {
return {
MeetingTypeEnums,
description: '报名信息编辑页',
form: this.$form.createForm(this),
confirmLoading: false,
@@ -233,8 +247,11 @@ export default {
guestType:{
rules: [{required: true, message: '请选择嘉宾类型'}],
validateTrigger: 'change'
},
post: {
rules: [{required: true, message: '请输入职务'}],
validateTrigger: 'blur'
}
},
// 身份类型
identifyType: null,
@@ -289,6 +306,16 @@ export default {
add: '/meeting/draftGroupMeetingSituation/add',
edit:'/meeting/draftGroupMeetingSituation/edit'
},
// 海外会议的url
overseasMeetingUrl: {
add: '/meeting/overseasSituation/add',
edit: '/meeting/overseasSituation/edit'
},
// 功能安全中心会议的url
safetyCenterMeetingUrl: {
add: '/meeting/safetyCenterMeetingSituation/add',
edit:'/meeting/safetyCenterMeetingSituation/edit'
},
title:'添加参会人',
// 当前参会企业是否是内部企业
isInternalEnterprise: false,
@@ -297,7 +324,17 @@ export default {
// 可选会议名称的数组
linkTopicsOptionArr: [],
// WASIC可选会议的数组-前端写死
showTopicsArr: [...WasicTopicData]
showTopicsArr: [...WasicTopicData],
// 功能安全中心id
safetyCenterId: this.$route.query.safetyCenterId,
// 成员单位列表(功能安全中心单独的选择成员列表接口)
companyList: '/company/payCompanyManagement/listSafetyCenter',
// 需要带上当前项目id
customListParams: {
projectId: this.$route.query.safetyCenterId,
// 查询本级可选,传其他值是查上级
type: '2'
}
}
},
created() {
@@ -340,10 +377,17 @@ export default {
return this.councilMeetingUrl
case '7':
return this.draftGroupMeetingUrl
// 海外会议
case MeetingTypeEnums.overseas.value:
return this.overseasMeetingUrl
// 功能安全中心会议
case MeetingTypeEnums.safetyCenter.value:
return this.safetyCenterMeetingUrl
}
},
},
methods: {
getContactsByCompanyBySafetyCenter,
// 验证选择会议名称的情况
checkChoiceTopic(rules, value, callback) {
console.log(value)
@@ -0,0 +1,498 @@
<template>
<div>
<page-header-title :is-level-one="false" :level-two-title="title"></page-header-title>
<a-card :bordered="false">
<a-spin :spinning="confirmLoading">
<!-- 海外会议单独的表单 -->
<a-form :form="form">
<!-- 海外会议的表单 -->
<div class="item-title">个人信息</div>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="照片" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-image-upload v-decorator="['photo',validatorRules.photo]" :return-id="true"
accept=".jpg,.jpeg,.png"
:file-type-list="['jpg', 'jpeg', 'png']"></j-image-upload>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="姓名" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入姓名"
:maxLength='50'
v-decorator="['name',validatorRules.name]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入性别"
:maxLength='50'
v-decorator="['sex',validatorRules.sex]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="国籍" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入国籍"
:maxLength='50'
v-decorator="['nationality',validatorRules.nationality]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="单位" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入单位"
:maxLength='50'
v-decorator="['unit',validatorRules.unit]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24" key="post">
<a-form-item label="职务" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入职务"
:maxLength='50'
v-decorator="['post',validatorRules.post]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="地址" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入地址"
:maxLength='50'
v-decorator="['address',validatorRules.address]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入邮箱"
:maxLength='50'
v-decorator="['email',validatorRules.email]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="联系电话" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入联系电话"
:maxLength='50'
v-decorator="['phone',validatorRules.phone]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="是否需要签证" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-decorator="['needVisa',validatorRules.needVisa]"
:triggerChange="true"
placeholder="请选择是否需要签证"
@change="changeNeedVisa"
type="radio"
dictCode="yn"/>
</a-form-item>
</a-col>
<template v-if="isNeedVisa">
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="出生日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择出生日期" style="width: 100%;"
v-decorator="['birthday',validatorRules.birthday]"
:trigger-change="true"
show-type="day"
date-format="YYYY-MM-DD"/>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="护照号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入护照号码"
:maxLength='50'
v-decorator="['passportNo',validatorRules.passportNo]"></a-input>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="入境日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择入境日期" style="width: 100%;"
v-decorator="['entryDate',validatorRules.entryDate]"
:trigger-change="true"
show-type="day"
date-format="YYYY-MM-DD"/>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="出境日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择出境日期" style="width: 100%;"
v-decorator="['exitDate',validatorRules.exitDate]"
:trigger-change="true"
show-type="day"
date-format="YYYY-MM-DD"/>
</a-form-item>
</a-col>
<a-col :xxl="8" :xl="12" :sm="24">
<a-form-item label="办理签证使领馆" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入办理签证使领馆"
:maxLength='50'
v-decorator="['embassiesAndConsulates',validatorRules.embassiesAndConsulates]"></a-input>
</a-form-item>
</a-col>
</template>
</a-row>
<div class="center">
<a-button class="submit" type="primary" @click="handleOk" v-preventclick>确定</a-button>
<a-button @click="handleCancel">取消</a-button>
</div>
</a-form>
</a-spin>
</a-card>
</div>
</template>
<script>
import {getMeetInfoById, getSingUpUserInfoOverseas} from '@api/incomeMeetingApi'
import {httpAction} from '@api/manage'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import {LinkTopicsEnums, MeetingTypeEnums, YesOrNoEnums} from '../../../enums/commonEnums'
import JImageUpload from '@comp/jero/JImageUpload'
import JDate from '@comp/tools/JDate'
import {isEmail} from '@/utils/validate'
export default {
name: 'SignUpInfoEdit',
components: {
JDate,
JImageUpload,
PageHeaderTitle
},
data() {
return {
MeetingTypeEnums,
description: '海外会议报名信息编辑页',
form: this.$form.createForm(this),
confirmLoading: false,
model: {},
formData:{},
labelCol: {
xs: {span: 24},
sm: {span: 6}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 18}
},
remarksLabelCol: {
xs: {span: 24},
sm: {span: 3}
},
remarksWrapperCol: {
xs: {span: 24},
sm: {span: 21}
},
validatorRules: {
photo: {
rules: [{required: true, message: '请上传照片'}],
validateTrigger: 'change'
},
name: {
rules: [{required: true, message: '请输入姓名'}],
validateTrigger: 'blur'
},
post: {
rules: [{required: true, message: '请输入职务'}],
validateTrigger: 'blur'
},
unit: {
rules: [{required: true, message: '请输入单位'}],
validateTrigger: 'blur'
},
international: {
rules: [{required: true, message: '请输入国际'}],
validateTrigger: 'blur'
},
address: {
rules: [{required: true, message: '请输入地址'}],
validateTrigger: 'blur'
},
email: {
rules: [{ required: true, validator: this.checkMail }],
validateTrigger: 'blur'
},
phone: {
rules: [{required: true, message: '请输入联系电话'}],
validateTrigger: 'blur'
},
needVisa: {
rules: [{required: true, message: '请选择是否需要签证'}],
validateTrigger: 'change'
},
foreignName: {
rules: [{required: true, message: '请输入外文姓名'}],
validateTrigger: 'blur'
},
sex: {
rules: [{required: true, message: '请输入性别'}],
validateTrigger: 'blur'
},
birthday: {
rules: [{required: true, message: '请选择出生日期'}],
validateTrigger: 'change'
},
nationality: {
rules: [{required: true, message: '请输入国籍'}],
validateTrigger: 'blur'
},
passportNo: {
rules: [{required: true, message: '请输入护照号码'}],
validateTrigger: 'blur'
},
entryDate: {
rules: [{required: true, message: '请选择入境日期'}],
validateTrigger: 'change'
},
exitDate: {
rules: [{required: true, message: '请选择出境日期'}],
validateTrigger: 'change'
},
embassiesAndConsulates: {
rules: [{required: true, message: '请输入办理签证使领馆'}],
validateTrigger: 'blur'
}
},
// 会议类型
meetingType: '',
// 当前会议的信息
currentMeetingInfo:{},
url:{
add: '/meeting/overseasSituation/add',
edit: '/meeting/overseasSituation/edit'
},
title:'添加参会人',
// 是否需要签证
isNeedVisa: false
}
},
created() {
this.meetingType = this.$route.query.meetingType
// 参会情况页面判断的是否会议费用为0 true 为0
if(this.$route.query.costBool === 'true'){
this.meetingCostBool = true
}else if(this.$route.query.costBool === 'false'){
this.meetingCostBool = false
}
if(this.$route.query.id){
getSingUpUserInfoOverseas({id: this.$route.query.id}).then(res => {
if(res.success) {
this.edit(res.result)
}
})
}
//获取 会议信息
if(this.$route.query.meetingId){
this.queryMeetingInfo(this.$route.query.meetingId)
}
},
computed:{
// 是否海外会议,报名信息调整
isOverseasMeeting () {
return this.meetingType + '' === MeetingTypeEnums.overseas.value
},
// eslint-disable-next-line
url() {
switch (this.$route.query.meetingType) {
case '1':
return this.workGroupMeetingUrl
case '2':
return this.standardsMeetingUrl
case '3':
return this.internalMeetingUrl
case '4':
return this.otherMeetingUrl
case '5':
return this.committeeMeetingUrl
case '6':
return this.councilMeetingUrl
case '7':
return this.draftGroupMeetingUrl
// 海外会议
case MeetingTypeEnums.overseas.value:
return this.overseasMeetingUrl
}
},
},
methods: {
// 是否需要签证改变
changeNeedVisa (val) {
if (val + '' === YesOrNoEnums.yes.value) {
this.isNeedVisa = true
} else {
this.isNeedVisa = false
}
},
// 验证选择会议名称的情况
checkChoiceTopic(rules, value, callback) {
console.log(value)
let arr = []
if (value && value.length > 0) {
arr = [...value]
}
let radioKey = this.form.getFieldValue('radioKey')
let radioKeyTwo = this.form.getFieldValue('radioKeyTwo')
if(radioKey || radioKeyTwo) {
callback()
} else {
arr = arr.filter(tt => tt !== LinkTopicsEnums.freeTwo.index + '')
if(arr.length === 0) {
callback('请至少选择一个非参观类会议')
} else {
callback()
}
}
},
/*
* 编辑
* */
async edit(record){
this.form.resetFields()
this.model = Object.assign({},record)
if(this.model.id){
this.title = '编辑参会人'
}
// 海外会议回显单独处理
this.changeNeedVisa(this.model.needVisa)
this.$nextTick(() => {
this.form.setFieldsValue(this.model)
})
},
/*
* 确定
* */
handleOk() {
const that = this
this.form.validateFields((err, values) => {
if (!err) {
this.confirmLoading = true
let submitData = Object.assign({},values,this.formData)
// 会议id
submitData.meetingId = this.$route.query.meetingId
// 会议类型
submitData.meetingType = this.$route.query.meetingType
console.log(submitData)
let url = ''
if(!this.model.id){
url = this.url.add
}else {
url = this.url.edit
// 编辑的时候需要传入id
submitData.id = this.model.id
}
// that.confirmLoading = false
// return
let method = 'post'
httpAction(url,submitData,method).then(res => {
if(res.success){
that.$emit('ok')
that.handleCancel()
that.$message.success(res.message)
that.confirmLoading = false
}else {
that.$message.warn(res.message)
}
}).finally( () => {
that.confirmLoading = false
})
}
})
},
/*
* 获取表单的值
* */
getFormData(value){
this.formData = Object.assign({},value)
},
/*
* 取消
* */
handleCancel() {
this.$router.go(-1)
},
/**
* @Description 通过会议id获取会议信息
* @Date 2021-11-29
* @param meetingId 会议id
* @author fac
* */
queryMeetingInfo(meetingId){
this.currentMeetingInfo = {}
getMeetInfoById({id: meetingId}).then(res => {
if(res.success){
this.currentMeetingInfo = res.result
}
})
},
/**
* 邮箱校验
* @param rules
* @param value
* @param callback
*/
checkMail(rules, value, callback) {
if (value) {
if (isEmail(value)) {
callback()
} else {
callback('请输入正确格式的邮箱')
}
}
callback('请输入邮箱')
},
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.center {
text-align: center;
.submit {
margin-right: 8px;
}
}
.item-title {
padding-left: 40px;
box-sizing: border-box;
height: 46px;
line-height: 46px;
color: #333;
position: relative;
font-size: 16px;
&::before {
position: absolute;
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background: #069f99;
top: 50%;
margin-top: -5px;
left: 15px;
}
}
// 国际研讨会-关联会议 多选样式的修改
.meeting-form-multi-select{
.topic-title{
padding: 10px 0;
}
/deep/.ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0!important;
}
/deep/ .ant-checkbox-wrapper,
/deep/ .ant-radio-wrapper{
margin-right: 8px;
display: block;
}
}
.radio-div{
border-top: 1px solid rgba(0, 0, 0, 0.2);
padding-top: 10px;
margin-top: 10px;
}
</style>
@@ -8,7 +8,7 @@
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<section class="check">
<section class="check" v-if="!batchCheckSignUp">
<h3>报名信息</h3>
<a-row :gutter="24">
<a-col :span="24">
@@ -63,46 +63,49 @@
<label class="color-999">订单后四位</label>
<span class="color-black">{{ model.orderCode }}</span></a-col>
</a-row>
<!--非查看状态 显示审核数据-->
<template v-if="!lookVoucherBool">
<h3>审核</h3>
<h3>审核</h3>
<a-form :form="form">
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="审核" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['checkResult',validatorRules.checkResult]" placeholder="请选择审核结果"
@change="changeCheck">
<a-radio value="1">
通过
</a-radio>
<a-radio value='2'>
驳回
</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark',validatorRules.checkRemark]"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="!checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark']"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
<a-form :form="form">
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="审核" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-radio-group v-decorator="['checkResult',validatorRules.checkResult]" placeholder="请选择审核结果"
@change="changeCheck">
<a-radio value="1">
通过
</a-radio>
<a-radio value='2'>
驳回
</a-radio>
</a-radio-group>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark',validatorRules.checkRemark]"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
<a-col :xl="24" :sm="24" v-if="!checkBool">
<a-form-item label="审核说明" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-textarea
placeholder="请输入审核说明"
:auto-size="{ minRows: 3, maxRows: 6 }"
:maxLength='200'
v-decorator="['checkRemark']"
@change="e => {e.target.value = (e.target.value + '').trim()}"/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</template>
</a-spin>
<template slot="footer">
<a-button @click="handleCancel">关闭</a-button>
@@ -115,6 +118,7 @@
import JImageUpload from '@comp/jero/JImageUpload'
import {httpAction} from '@api/manage'
import {getSingUpUserInfo} from '@api/incomeMeetingApi'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
name: 'AuditModal',
@@ -185,7 +189,9 @@ export default {
// 审核凭证
check: '/meeting/workGroupMeetingSituation/check',
// 审核报名信息
checkSignUp: '/meeting/workGroupMeetingSituation/checkRegister'
checkSignUp: '/meeting/workGroupMeetingSituation/checkRegister',
// 批量审核报名信息
checkSignUpBatch: '/meeting/workGroupMeetingSituation/checkRegisterBatch',
},
// 分标委会议url
committeeMeetingUrl: {
@@ -220,14 +226,27 @@ export default {
// 审核凭证
check: '/meeting/draftGroupMeetingSituation/check',
// 审核报名信息
checkSignUp: '/meeting/draftGroupMeetingSituation/checkRegister'
checkSignUp: '/meeting/draftGroupMeetingSituation/checkRegister',
// 批量审核报名信息
checkSignUpBatch: '/meeting/draftGroupMeetingSituation/checkRegisterBatch',
},
// 功能安全中心会议url
safetyCenterMeetingUrl: {
// 审核凭证
check: '/meeting/safetyCenterMeetingSituation/check',
// 审核报名信息
checkSignUp: '/meeting/safetyCenterMeetingSituation/checkRegister'
},
// 审核结果选择
checkBool: false,
// 是否是审核报名信息
checkSignBool: false,
// 是否批量 核查报名信息
batchCheckSignUp: false,
// 参会人id
signUpPersonId: '',
// 是否为查看凭证
lookVoucherBool: false
}
},
watch:{
@@ -238,12 +257,23 @@ export default {
}
},
methods: {
/*
* record- 审核参数
* signUp- 是否审核报名信息
* */
open(record, signUp) {
this.form.resetFields()
this.signUpPersonId = this.situationId ? this.situationId : record.id
// 控制行程信息显示 审核凭证不显示
this.checkSignBool = signUp || false
let meetingType = this.meetingType ? this.meetingType+'' :this.$route.query.meetingType
this.signUpPersonId = this.situationId ? this.situationId : record.id
// 判断是否为工作组的批量审批功能,批量审批record 的参数 batch= true ids 存储多条数据
if(signUp && record.batch && record.ids) {
this.model = Object.assign({}, record)
this.batchCheckSignUp = true
} else {
this.batchCheckSignUp = false
}
// 到账开票
if(record.type && record.type === 'kp' ){
meetingType = record.meetingType + ''
@@ -256,11 +286,19 @@ export default {
this.url = Object.assign({}, this.createUrlByMeetingType(meetingType))
this.visible = true
},
/* 查看凭证
* record- 审核参数
* */
lookVoucher(record) {
this.lookVoucherBool = true
this.open(record, false)
},
close() {
this.$emit('close')
this.visible = false
this.model = {}
this.signUpPersonId = ''
this.lookVoucherBool = false
},
handleOk() {
const that = this
@@ -268,17 +306,24 @@ export default {
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
const formData = Object.assign({}, values)
let httpurl = ''
if (that.checkSignBool) {
// 审核报名信息的接口
httpurl = this.url.checkSignUp
if(this.batchCheckSignUp) {
// 批量 审核报名信息的接口
httpurl = this.url.checkSignUpBatch
formData.ids = this.model.ids
} else {
// 审核报名信息的接口
httpurl = this.url.checkSignUp
formData.id = this.model.id
}
} else {
// 审核凭证的接口
httpurl = this.url.check
formData.id = this.model.id
}
let method = 'post'
const formData = Object.assign({}, values)
formData.id = this.model.id
httpAction(httpurl, formData, method).then((res) => {
if (res.success) {
that.$message.success(res.message)
@@ -335,6 +380,9 @@ export default {
return this.councilMeetingUrl
case '7':
return this.draftGroupMeetingUrl
// 功能安全中心
case MeetingTypeEnums.safetyCenter.value:
return this.safetyCenterMeetingUrl
}
}
}
@@ -28,6 +28,7 @@
<script>
import { httpAction } from '@api/manage'
import {MeetingTypeEnums} from '@/enums/commonEnums'
const requestUrlObj = {
workGroupMeetingUrl: '/meeting/workGroupMeetingSituation/setGuestsUploadFile', // 工作组
standardsMeetingUrl: '/meeting/payMeetingSituation/setGuestsUploadFile', // 标协会议
@@ -36,6 +37,7 @@ const requestUrlObj = {
committeeMeetingUrl: '/meeting/committeeMeetingSituation/setGuestsUploadFile', // 分标委会议的url
councilMeetingUrl: '/meeting/councilMeetingSituation/setGuestsUploadFile', // 理事会的url
draftGroupMeetingUrl: '/meeting/draftGroupMeetingSituation/setGuestsUploadFile', // 起草组
safetyCenterMeetingUrl: '/meeting/safetyCenterMeetingSituation/setGuestsUploadFile', // 功能安全中心url
}
export default {
@@ -68,6 +70,9 @@ export default {
return requestUrlObj.councilMeetingUrl
case 7:
return requestUrlObj.draftGroupMeetingUrl
// 功能安全中心
case Number(MeetingTypeEnums.safetyCenter.value):
return requestUrlObj.safetyCenterMeetingUrl
// 为了解决控制台报错写的
default:return requestUrlObj.workGroupMeetingUrl
}
@@ -10,7 +10,7 @@
<a-spin :spinning="confirmLoading">
<!-- 以表格的形式展示 所有的文件 -->
<div class="table-operator">
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader"
<a-upload name="file" :showUploadList="false" :multiple="true" :headers="tokenHeader"
:action="importExcelUrl" :beforeUpload="beforeUpload" @change="handleChange"
>
<a-button type="primary" icon="plus">新增</a-button>
@@ -61,6 +61,7 @@ import { ACCESS_TOKEN } from '../../../../store/mutation-types'
import { Modal } from 'ant-design-vue'
import store from '@/store'
import { isExternalTerminal } from '../../../../utils/util'
import {MeetingTypeEnums} from '@/enums/commonEnums'
const FILE_TYPE_ALL = 'all'
const columns = [
@@ -208,6 +209,18 @@ export default {
uploadFile: '/meeting/draftGroupMeeting/uploadFile',
uploadCouncilFile: '/meeting/draftGroupMeeting/uploadCouncilFile',
}
// 海外会议
case MeetingTypeEnums.overseas.value:
return {
uploadFile: '/meeting/overseas/uploadFile',
uploadCouncilFile: '/meeting/overseas/uploadCouncilFile',
}
// 安全中心会议
case MeetingTypeEnums.safetyCenter.value:
return {
uploadFile: '/meeting/safetyCenterMeeting/uploadFile',
uploadCouncilFile: '/meeting/safetyCenterMeeting/uploadCouncilFile'
}
}
},
handleOk() {
@@ -356,8 +369,8 @@ export default {
file.uploadGoOn = true
const fileSize = file.size // 上传的文件大小
const fileType = file.type // 上传的文件类型
if (fileSize > 1024 * 1024 * 100) {
this.$message.warning('文件大小限制为100M')
if (fileSize > 1024 * 1024 * 200) {
this.$message.warning('文件大小限制为200M')
this.uploadGoOn = false
file.uploadGoOn = false
return false
@@ -0,0 +1,192 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="会员单位">
<a-input
placeholder="请输入会员单位"
v-model="queryParam.companyName"
></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="会员状态">
<j-dict-select-tag
placeholder="请选择会员状态"
v-model="queryParam.memberStatus"
dict-code="member_status"
></j-dict-select-tag>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="生效日期">
<a-month-picker
style="width: 100%"
v-model="queryParam.effectiveDateStr"
format="YYYY-MM"
value-format="YYYY-MM"
placeholder="请选择生效日期"
/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="失效日期">
<a-month-picker
style="width: 100%"
v-model="queryParam.invalidationDateStr"
format="YYYY-MM"
value-format="YYYY-MM"
placeholder="请选择失效日期"
/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search" v-has="'memberStatistic:search'">查询</a-button>
<a-button @click="searchReset" class="reset-button" icon="reload" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button
type="primary"
icon="download"
@click="handleExportXls('会员信息统计')"
v-has="'memberStatistic:export'">
导出
</a-button>
</div>
<!-- table区域-begin -->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{
selectedRowKeys: selectedRowKeys,
onChange: onSelectChange,
}"
class="j-table-force-nowrap"
@change="handleTableChange"
>
<template slot="detail" slot-scope="text, record">
<div @click="openDetailModal(record)" class="color-blue">
{{ text }}
</div>
</template>
<template slot="text" slot-scope="text">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<!--<span slot="action" slot-scope="text, record" class="action-span-cell">-->
<!-- <a @click="handleEdit(record)" v-has="'safeguardStardsMember:edit'">查看</a>-->
<!--</span>-->
</a-table>
</div>
</a-card>
</div>
</template>
<script>
import { JeroListMixin } from '@/mixins/JeroListMixin'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_stander_member.png'
export default {
name: 'MemberStatisticList',
mixins: [JeroListMixin],
components: {
PageHeaderTitle,
},
data() {
return {
IconImg,
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
},
},
{
title: '会员编号',
align: 'center',
dataIndex: 'memberNo',
scopedSlots: { customRender: 'text' },
},
{
title: '会员单位',
align: 'center',
dataIndex: 'companyName',
scopedSlots: { customRender: 'detail' },
},
{
title: '企业联系人',
align: 'center',
dataIndex: 'liaisonManId_dictText',
scopedSlots: { customRender: 'text' },
},
{
title: '会员状态',
align: 'center',
dataIndex: 'memberStatus_dictText',
scopedSlots: { customRender: 'text' },
},
{
title: '生效日期',
align: 'center',
dataIndex: 'effectiveDateStr',
scopedSlots: { customRender: 'text' },
},
{
title: '失效日期',
align: 'center',
dataIndex: 'invalidationDateStr',
scopedSlots: { customRender: 'text' },
}
// {
// title: '操作',
// align: 'center',
// dataIndex: '',
// scopedSlots: {customRender: 'action'}
// }
],
url: {
list: '/member/annulMemberProject/page',
exportXlsUrl: '/member/annulMemberProject/exportXls'
},
}
},
methods: {
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
</style>
@@ -47,14 +47,22 @@
<j-year-date style="width:100%" placeholder="请选择来款年份" v-model="queryParam.year"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-range-picker
style="width: 100%"
v-model="queryParam.estimatedArrivalDate"
format="YYYY-MM-DD"
:placeholder="['开始时间', '结束时间']"
@change="onDateChange"
<j-month-date placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.start]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledStartMonth"
/>
<span class="query-group-split-cust"></span>
<j-month-date placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.end]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledEndMonth"
/>
</a-form-item>
</a-col>
@@ -179,17 +187,20 @@ import { formatMoney } from '@/utils/formatMoney'
import {getAction} from '@api/manage'
import {getFileInfo} from '@api/api'
import {getPayConfirmList} from '@api/incomePaymentsApi'
import { MonthRangeMixin } from '../../../mixins/MonthRangeMixins'
import JMonthDate from '../../../components/tools/JMonthDate'
export default {
name: 'SafeguardMemberList',
mixins: [JeroListMixin, mixinDevice],
mixins: [JeroListMixin, mixinDevice, MonthRangeMixin],
components: {
JYearDate,
SafeguardMemberModal,
ProjectDetailModal,
StatusSlot,
PageHeaderTitle,
PreviewFile
PreviewFile,
JMonthDate
},
data() {
return {
@@ -369,10 +380,6 @@ export default {
this.currentInfo.fileName = res.result.fileName
}
})
},
onDateChange: function (value, dateString) {
this.queryParam.estimatedArrivalStartDate = dateString[0]
this.queryParam.estimatedArrivalEndDate = dateString[1]
}
}
}
@@ -50,14 +50,22 @@
></j-dict-select-tag>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="预估到账日期">
<a-range-picker
style="width: 100%"
v-model="queryParam.estimatedArrivalDateArr"
format="YYYY-MM-DD"
:placeholder="['开始时间', '结束时间']"
@change="onDateChange"
<j-month-date placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.start]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledStartMonth"
/>
<span class="query-group-split-cust"></span>
<j-month-date placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.end]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledEndMonth"
/>
</a-form-item>
</a-col>
@@ -180,7 +188,7 @@
<!-- 开票-->
<template slot="status-bill" slot-scope="text,record">
<status-slot :statu-obj="record" :status-no="text" :status-type="true" status-key="bill"></status-slot>
<status-slot :statu-obj="record" :status-no="text" :status-type="true" status-key="bill" invoice-key="invoiceRequirements"></status-slot>
</template>
<!-- 确收 -->
@@ -227,10 +235,12 @@ import {getPayConfirmList, getStardsMemberProjectById, memberDrawTicket} from '@
import MemberEquityModal from './modules/MemberEquityModal'
import MemberCopyModal from './modules/MemberCopyModal'
import { ProjectTypeEnums } from '@/enums/commonEnums'
import { MonthRangeMixin } from '../../../mixins/MonthRangeMixins'
import JMonthDate from '../../../components/tools/JMonthDate'
export default {
name: 'SafeguardStardsMemberList',
mixins: [JeroListMixin, mixinDevice],
mixins: [JeroListMixin, mixinDevice, MonthRangeMixin],
components: {
ProjectDetailModal,
StatusSlot,
@@ -238,7 +248,8 @@ export default {
PreviewFile,
SafeguardStardsMemberModal,
MemberEquityModal,
MemberCopyModal
MemberCopyModal,
JMonthDate
},
computed: {
importExcelUrl: function () {
@@ -373,6 +384,10 @@ export default {
}
],
disableMixinCreated: true,
rangeMonthKey:{
start: 'estimatedArrivalDate_begin',
end: 'estimatedArrivalDate_end',
},
url: {
list: '/member/tbMemberProjectSubitem/page',
exportXlsUrl: '/member/tbMemberProjectSubitem/exportXls',
@@ -447,8 +462,8 @@ export default {
this.uploadGoOn = true
file.uploadGoOn = true
const fileSize = file.size // 上传的文件大小
if (fileSize > 1024 * 1024 * 100) {
this.$message.warning('文件大小限制为100M')
if (fileSize > 1024 * 1024 * 200) {
this.$message.warning('文件大小限制为200M')
this.uploadGoOn = false
file.uploadGoOn = false
return false
@@ -60,6 +60,7 @@
</template>
<span slot="operation" class="action-span-cell" slot-scope="text, record">
<a @click="handleImportMemberModule(record)" v-has="'council:exportToMember'">导入到标协会员</a>
<a @click="handleMaintainData(record)" v-has="'council:fileMaintenance'">其他分发资料</a>
<a @click="handleMaintainMeeting(record)" v-has="'council:meetingMaintenance'">理事会会议</a>
<a @click="handleAddMember(record)" v-has="'council:addMember'">新增成员</a>
@@ -94,6 +95,8 @@
<council-maintenance-modal ref="modalForm" @ok="modalFormOk"></council-maintenance-modal>
<!-- 新增理事会成员-->
<council-maintenance-member-modal ref="memberModalForm" @ok="modalFormOk"></council-maintenance-member-modal>
<!-- 导入到标协会员 -->
<import-member-module-modal ref="importMemberModuleModal" @ok="modalFormOk"></import-member-module-modal>
</div>
</template>
@@ -104,10 +107,11 @@ import IconImg from '../../../../assets/imgs/icon/icon_stander_member.png'
import { getAction } from '../../../../api/manage'
import CouncilMaintenanceModal from './modules/CouncilMaintenanceModal'
import CouncilMaintenanceMemberModal from './modules/CouncilMaintenanceMemberModal'
import ImportMemberModuleModal from './modules/ImportMemberModuleModal'
export default {
name: 'CouncilMaintenanceList',
components: { PageHeaderTitle, CouncilMaintenanceModal, CouncilMaintenanceMemberModal },
components: { PageHeaderTitle, CouncilMaintenanceModal, CouncilMaintenanceMemberModal, ImportMemberModuleModal },
mixins: [JeroListMixin],
data() {
return {
@@ -139,7 +143,7 @@ export default {
title: '操作',
dataIndex: 'operation',
align: 'center',
width: 420,
width: 580,
scopedSlots: { customRender: 'operation' }
}
],
@@ -302,6 +306,13 @@ export default {
})
}
})
},
/**
* 导入到标协会员
* @param record
*/
handleImportMemberModule(record) {
this.$refs.importMemberModuleModal.add(record)
}
}
}
@@ -0,0 +1,160 @@
<!--导入到标协会员-->
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-row>
<a-col>
<a-form-item label="标协会员项目" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-select placeholder="请选择标协会员项目"
show-search
v-decorator="['projectId',validatorRules.projectId]"
option-filter-prop="children"
:filter-option="filterOption"
>
<a-select-option v-for="item in memberProjectList" :key="item.id" :value="item.id">
{{ item.projectName }}
</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import { getAction, httpAction } from '../../../../../api/manage'
export default {
name: 'ImportMemberModuleModal',
data() {
return {
title: '操作',
width: 800,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 14 }
},
remarksLabelCol: {
xs: {span: 24},
sm: {span: 3}
},
remarksWrapperCol: {
xs: {span: 24},
sm: {span: 21}
},
// 不包含在列表的会员项目
memberProjectList:[],
validatorRules: {
projectId: {
rules: [{ required: true, message: '请选择标协会员项目' }],
validateTrigger: 'change'
}
},
url: {
add: '/payCaseCouncilSubitem/payCaseCouncilSubitem/import',
memberList: '/member/tbMemberProject/page',
}
}
},
methods: {
add(record) {
this.edit({id: record.id})
},
edit(record) {
this.form.resetFields()
this.model = Object.assign({}, record)
this.visible = true
this.queryMemberProject()
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'projectId'))
})
},
close() {
this.$emit('close')
this.visible = false
},
/*
* 查询会员项目
* */
queryMemberProject() {
const param = {
pageNo: 1,
pageSize: -1
}
this.memberProjectList = []
getAction(this.url.memberList, param).then(res => {
if(res.success){
this.memberProjectList = res.result.records || res.result || []
}else {
console.log(res.message)
}
})
},
handleOk() {
if (this.confirmLoading) {
return
}
this.confirmLoading = true
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
let method = 'post'
let httpUrl = this.url.add
const 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')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
} else {
this.confirmLoading = false
}
})
},
handleCancel() {
this.close()
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
}
}
}
</script>
<style scoped>
</style>
@@ -134,11 +134,11 @@
<a-row>
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
<j-month-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
date-format="YYYY-MM"
/>
</a-form-item>
</a-col>
@@ -276,14 +276,14 @@ import { checkAssociatedProject } from '@/utils/projectCheck'
import SelectRevenueContract from '../../../../components/tools/SelectRevenueContract'
import JDictSelectTag from '@comp/dict/JDictSelectTag'
import { CalcAmountMixin } from '@/mixins/CalcAmountMixin'
import JDate from '@/components/tools/JDate'
import JMonthDate from '@/components/tools/JMonthDate'
export default {
name: 'SafeguardMemberModal',
mixins:[CalcAmountMixin],
components: {
JUpload,
JDate,
JMonthDate,
JDictSelectTag,
CompanySelect,
// ContactManagementModule,
@@ -150,11 +150,11 @@
<a-row :gutter="24">
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
<j-month-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
date-format="YYYY-MM"
/>
</a-form-item>
</a-col>
@@ -265,7 +265,7 @@
<script>
import JUpload from '@/components/jero/JUpload'
import JDate from '@/components/jero/JDate'
import JMonthDate from '@/components/tools/JMonthDate'
import JDictSelectTag from '@/components/dict/JDictSelectTag'
import CompanySelect from '@/components/company/CompanySelect'
import SelectContacts from '@/components/company/SelectContacts'
@@ -283,7 +283,7 @@ export default {
mixins: [CalcAmountMixin],
components: {
JUpload,
JDate,
JMonthDate,
JDictSelectTag,
CompanySelect,
SelectContacts,
@@ -0,0 +1,142 @@
<template>
<a-spin :spinning="loading">
<page-header-title :img-for-icon="IconImg" :is-level-one="false" :level-two-title="title"></page-header-title>
<a-card :bordered="false" class="description-box">
<a-descriptions bordered size="middle" class="description-item" :class="{'description-item-close': !section.isOpen}" v-for="section in sectionList" :key="section.id" :column="section.column">
<div slot="title" class="description-head">
<div class="description-head-title">{{ section.title }}</div>
<div class="description-head-btn" @click="section.isOpen = !section.isOpen">
<a-icon :type="section.isOpen ? 'up' : 'down'" style="margin-right: 4px;" /> {{ section.isOpen ? '收起' : '展开' }}
</div>
</div>
<a-descriptions-item v-for="label in section.labelList" :key="label.label"
:span="label.span ? label.span : 1"
:label="label.label">{{ model[label.valueField] }}</a-descriptions-item>
</a-descriptions>
</a-card>
</a-spin>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@assets/imgs/icon/icon_committee_detail.png'
import {getAction} from '@api/manage'
export default {
name: 'CommitteeInfoDetail',
components: {PageHeaderTitle},
data () {
return {
IconImg,
title: this.$route.meta.title,
loading: true,
model: {},
// 内容块列表(column列数 一行显示几个字段,配合labelList[].span占用几列使用)
sectionList: [
{
id: '1',
title: '委员会基础信息',
isOpen: true,
column: 2,
labelList: [
{ label: '委员会名称', valueField: 'committeeName', span: 2 },
{ label: '英文名称', valueField: 'englishName', span: 2 },
{ label: 'TC|SC号', valueField: 'committeeName', span: 2 },
{ label: '负责专业范围', valueField: 'responsibleForProfessionalScope', span: 2 },
{ label: '届号', valueField: 'whatIsTheCurrentSession' },
{ label: '第一届成立年代', valueField: 'establishmentYear' },
{ label: '第一届成立时间', valueField: 'firstEstablishmentDate' },
{ label: '第一届成立文号', valueField: 'establishmentNumber' },
{ label: '本届批准文号编号', valueField: 'approvalNumberForThisSession' },
{ label: '本届批准时间', valueField: 'approvalTimeForThisSession' },
{ label: '筹建单位', valueField: 'preparationUnit', span: 2 },
{ label: '业务指导单位', valueField: 'businessGuidanceUnit', span: 2 },
]
},
{
id: '2',
title: '秘书处信息信息',
isOpen: true,
column: 2,
labelList: [
{ label: '秘书处所在单位', valueField: 'theUnitToWhichOneBelongs' },
{ label: '秘书长', valueField: 'secretaryGeneral' },
{ label: '所在单位性质', valueField: 'unitNature', span: 2 },
{ label: '所在单位的社会统一信用代码(或组织机构代码)', valueField: 'orgCode', span: 2 },
{ label: '所在单位的省份', valueField: 'province' },
{ label: '所在单位的城市', valueField: 'city' },
{ label: '通讯地址', valueField: 'secretariatMailingAddress', span: 2 },
{ label: '办公电话', valueField: 'telephone' },
{ label: '传真', valueField: 'facsimile' },
{ label: '电子邮箱', valueField: 'email' },
{ label: '邮编', valueField: 'zipCode' },
{ label: '联系人', valueField: 'contacts', span: 2 },
{ label: '联系人办公电话', valueField: 'contactPhoneNumber' },
{ label: '联系人传真', valueField: 'contactFax' },
{ label: '联系人电子邮箱', valueField: 'contactEmail' },
{ label: '联系人手机', valueField: 'cellPhone' },
]
},
]
}
},
created () {
this.model.id = this.$route.query.id
this.loadData()
},
methods: {
loadData () {
this.loading = true
getAction('/PayCommitteeInfo/queryById', {id: this.model.id}).then(res => {
if (res.success) {
this.model = res.result
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
}
}
}
</script>
<style lang="less" scoped>
.description-box {
/deep/ .ant-descriptions-view {
border-radius: 0;
}
// 字段列的宽度
/deep/ .ant-descriptions-item-label {
width: 20%;
}
// 一块的头部样式
/deep/ .ant-descriptions-title {
margin-bottom: 0;
background-color: #E6F5F5;
padding: 12px 24px;
color: @primary-color;
}
.description-head {
display: flex;
justify-content: space-between;
align-items: center;
.description-head-btn {
font-weight: 500;
font-size: 14px;
cursor: pointer;
}
}
.description-item {
margin-bottom: 20px;
&.description-item-close /deep/ .ant-descriptions-view {
display: none;
}
}
}
</style>
@@ -0,0 +1,224 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入委员会名称" v-model="queryParam.committeeName" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="TC/SC号" v-model="queryParam.committeeNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery" v-has="'committeeInfo:search'">查询</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="export" @click="handleExportXls('委员会表')" v-has="'committeeInfo:export'">导出</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1300}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 跳转详情 -->
<template slot="detail" slot-scope="text, record">
<j-ellipsis :value="text" :length="20" @click="handleDetail(record)" class="can-click"></j-ellipsis>
</template>
<!-- 跳转委员信息 -->
<template slot="memberNumber" slot-scope="text, record">
<j-ellipsis value="查看" :length="20" @click="handleMember(record)" class="can-click"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : '' }}</template>
<div class="table-text">{{ text || text === 0 ? text : '' }}</div>
</a-tooltip>
</template>
</a-table>
</div>
<!-- /table表格区域-->
</a-card>
</div>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_organizational_manage.png'
import {JeroListMixin} from '@/mixins/JeroListMixin'
export default {
name: 'CommitteeInfoList',
components: {PageHeaderTitle},
mixins: [JeroListMixin],
data () {
return {
isorter: null,
IconImg,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: 'TC号',
align: 'center',
width: 140,
dataIndex: 'committeeNumber',
scopedSlots: { customRender: 'text' }
},
{
title: '委员会名称',
align: 'center',
width: 140,
dataIndex: 'committeeName',
scopedSlots: { customRender: 'detail' }
},
{
title: '委员信息',
align: 'center',
width: 100,
dataIndex: 'memberNumber',
scopedSlots: { customRender: 'memberNumber' }
},
{
title: '秘书处承担单位',
align: 'center',
width: 200,
dataIndex: 'theUnitToWhichOneBelongs',
scopedSlots: { customRender: 'text' }
},
{
title: '业务指导单位',
align: 'center',
width: 200,
dataIndex: 'businessGuidanceUnit',
scopedSlots: { customRender: 'text' }
},
{
title: '专业范围',
align: 'center',
width: 280,
dataIndex: 'responsibleForProfessionalScope',
scopedSlots: { customRender: 'text' }
},
{
title: '秘书长',
align: 'center',
width: 100,
dataIndex: 'secretaryGeneral',
scopedSlots: { customRender: 'text' }
},
{
title: '办公电话',
align: 'center',
width: 140,
dataIndex: 'telephone',
scopedSlots: { customRender: 'text' }
},
{
title: '电子邮箱',
align: 'center',
width: 200,
dataIndex: 'email',
scopedSlots: { customRender: 'text' }
},
{
title: '本届批准文号',
align: 'center',
width: 140,
dataIndex: 'approvalNumberForThisSession',
scopedSlots: { customRender: 'text' }
},
],
url: {
list: '/PayCommitteeInfo/page',
exportXlsUrl: '/PayCommitteeInfo/exportXls'
}
}
},
methods: {
// 跳转详情
handleDetail (record) {
this.$router.push({
path: '/organizationalManage/committeeDetail',
query: {
id: record.id
}
})
},
// 跳转委员信息页面
handleMember (record) {
this.$router.push({
path: '/organizationalManage/committeeMemberInfo',
query: {
committeeNumber: record.committeeNumber
}
})
},
handleTableChange(pagination) {
//分页、排序、筛选变化时触发
this.ipagination = pagination
this.loadData()
}
}
}
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.can-click {
cursor: pointer;
color: @primary-color;
}
.table-text {
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
@@ -0,0 +1,211 @@
<template>
<a-spin :spinning="loading">
<page-header-title :img-for-icon="IconImg" :is-level-one="false" :level-two-title="title"></page-header-title>
<a-card :bordered="false" class="description-box" ref="descriptionBox">
<a-descriptions bordered size="middle" class="description-item" :class="{'description-item-close': !section.isOpen}" v-for="section in sectionList" :key="section.id" :column="section.column">
<div slot="title" class="description-head">
<div class="description-head-title">{{ section.title }}</div>
<div class="description-head-btn" @click="section.isOpen = !section.isOpen">
<a-icon :type="section.isOpen ? 'up' : 'down'" style="margin-right: 4px;" /> {{ section.isOpen ? '收起' : '展开' }}
</div>
</div>
<a-descriptions-item v-for="(label, index) in section.labelList" :key="label.label || index"
:span="label.span ? label.span : 1"
:class="{'descriptions-item-none': label.type === 'none'}"
:label="label.label">
<!-- 默认的直接显示 -->
<span v-if="!label.type">{{ model[label.valueField] }}</span>
<!-- 多个字段数组用函数处理好内容显示 -->
<span v-else-if="label.type === 'arr'">{{ fieldArrToContent(label.split, label.valueField) }}</span>
<!-- 图片 -->
<div v-else-if="label.type === 'img'" class="descriptions-item-content-img">
<img v-if="model[label.valueField]" :src="getImgUrl(model[label.valueField])" alt="">
<a-avatar v-else :size="90" icon="user" />
</div>
</a-descriptions-item>
</a-descriptions>
</a-card>
</a-spin>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@assets/imgs/icon/icon_committee_detail.png'
import {getAction, getFileAccessHttpUrl} from '@api/manage'
export default {
name: 'CommitteeMemberInfoDetail',
components: {PageHeaderTitle},
data () {
return {
IconImg,
title: this.$route.meta.title,
loading: true,
model: {},
// 内容块列表(column列数 一行显示几个字段,配合labelList[].span占用几列使用)
sectionList: [
{
id: '1',
title: '基本信息',
isOpen: true,
column: 2,
labelList: [
{ label: '个人照片', valueField: 'photo', type: 'img' },
{ label: '姓名', valueField: 'name' },
{ label: '', valueField: '', type: 'none' }, // 为了个人照片跨三列空出来,配合样式display:none隐藏
{ label: '性别', valueField: 'gender' },
{ label: '', valueField: '', type: 'none' }, // 为了个人照片跨三列空出来,配合样式display:none隐藏
{ label: '出生年月', valueField: 'birthDate' },
{ label: '民族', valueField: 'nation' },
{ label: '政治面貌', valueField: 'politicalLandscape' },
{ label: '身份证', valueField: 'identificationNumber' },
{ label: '委员会职务', valueField: 'positionOfStandardsCommittee' },
{ label: '委员会编号', valueField: 'committeeNumber' },
{ label: '委员会聘书编号', valueField: 'appointmentLetterNumber' },
{ label: '聘书有效期', valueField: 'validityPeriodOfEmploymentLetter' },
{ label: '加入标委会时间', valueField: 'committeeParticipationTime' },
{ label: '行政职务', valueField: 'administrativePosition' },
{ label: '从事专业', valueField: 'engagedInProfession' },
{ label: '技术职称', valueField: 'technicalTitle' },
{ label: '职称级别', valueField: 'titleLevel' },
]
},
{
id: '2',
title: '工作单位信息',
isOpen: true,
column: 2,
labelList: [
{ label: '工作单位', valueField: 'workUnit' },
{ label: '单位统一社会信用代码(或组织机构代码)', valueField: 'orgCode' },
{ label: '单位性质', valueField: 'unitNature' },
{ label: '央企级别', valueField: 'centralEnterpriseLevel' },
{ label: '所属相关方', valueField: 'affiliatedParties' },
{ label: '所在省、直辖市、自治区、特区', valueField: 'provinceOfWorkUnit' },
{ label: '通信地址', valueField: 'communicationAddress' },
{ label: '邮政编码', valueField: 'zipCode' },
{ label: '联系电话', valueField: 'contactPhoneNumber' },
{ label: '手机', valueField: 'mobilePhone' },
{ label: '传真', valueField: 'facsimile' },
{ label: '电子邮箱', valueField: 'email' },
]
},
{
id: '3',
title: '毕业院校信息',
isOpen: true,
column: 2,
labelList: [
{ label: '毕业院校', valueField: 'graduationInstitution' },
{ label: '所学专业', valueField: 'majorStudied' },
{ label: '学历', valueField: 'educationalBackground' },
{ label: '学位', valueField: 'degree' },
{ label: '专业技术特长', valueField: 'professionalTechnicalExpertise' },
{ label: '会何种外语及熟练程度', valueField: ['foreignLanguage', 'foreignLanguageProficiencyLevel'], split: ' ', type: 'arr' },
{ label: '其他语言及熟练程度', valueField: 'otherLanguagesAndProficiencyLevels' },
{ label: '两院院士', valueField: 'isAcademician' },
]
}
]
}
},
created () {
this.model.id = this.$route.query.id
this.loadData()
},
mounted() {
// 处理图片要跨行,组件没有提供跨行的属性
const imgEl = this.$refs.descriptionBox.$el.querySelector('.descriptions-item-content-img')
imgEl.parentNode.setAttribute('rowspan', 3)
imgEl.parentNode.previousElementSibling.setAttribute('rowspan', 3)
},
methods: {
loadData () {
this.loading = true
getAction('/PayCommitteeMemberInfo/queryById', {id: this.model.id}).then(res => {
if (res.success) {
this.model = res.result
} else {
this.$message.warning(res.message)
}
}).finally(() => {
this.loading = false
})
},
// 获取图片url
getImgUrl (id) {
return getFileAccessHttpUrl(id)
},
/**
* 将字段数组转内容
* @param split - 分隔符
* @param fieldArr - 字段的数组
* @return {string} - 返回拼接的内容
*/
fieldArrToContent (split, fieldArr) {
let arr = []
fieldArr.forEach(field => {
const val = this.model[field]
if (val || val === 0) {
arr.push(val)
}
})
return arr.join(split)
}
}
}
</script>
<style lang="less" scoped>
.description-box {
/deep/ .ant-descriptions-view {
border-radius: 0;
}
// 字段列的宽度
/deep/ .ant-descriptions-item-label {
width: 20%;
}
// 一块的头部样式
/deep/ .ant-descriptions-title {
margin-bottom: 0;
background-color: #E6F5F5;
padding: 12px 24px;
color: @primary-color;
}
.description-head {
display: flex;
justify-content: space-between;
align-items: center;
.description-head-btn {
font-weight: 500;
font-size: 14px;
cursor: pointer;
}
}
.description-item {
margin-bottom: 20px;
&.description-item-close /deep/ .ant-descriptions-view {
display: none;
}
}
// 没有内容的label就不显示
/deep/ .ant-descriptions-item-no-label {
display: none;
// label对应的内容单元格也不显示
& + .ant-descriptions-item-content {
display: none;
}
}
.descriptions-item-content-img {
img {
max-height: 200px;
max-width: 200px;
}
}
}
</style>
@@ -0,0 +1,260 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="TC/SC号" v-model="queryParam.committeeNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-select v-model="queryParam.positionOfStandardsCommittee"
show-search
allowClear
placeholder="请选择委员会职务"
:filter-option="filterOption">
<a-select-option v-for="item in committeePositionList" :key="item" :value="item">{{ item }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入聘书编号" v-model="queryParam.appointmentLetterNumber" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入工作单位" v-model="queryParam.workUnit" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item>
<a-input placeholder="请输入委员名称" v-model="queryParam.name" :maxLength='50' allowClear></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery" v-has="'committeeMemberInfo:search'">查询</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /查询区域-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="export" @click="handleExportXls('委员会成员表')" v-has="'committeeMemberInfo:export'">导出</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 1300}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<!-- 跳转详情 -->
<template slot="detail" slot-scope="text, record">
<j-ellipsis :value="text" :length="20" @click="handleDetail(record)" class="can-click"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip overlay-class-name="tooltip-style">
<template slot="title">{{ text || text === 0 ? text : '' }}</template>
<div class="table-text">{{ text || text === 0 ? text : '' }}</div>
</a-tooltip>
</template>
<!--操作-->
<span slot="action" class="action-span-cell" slot-scope="record">
<a v-has="'committeeMemberInfo:uploadPhoto'" @click="uploadPhoto(record)">上传个人头像</a>
</span>
</a-table>
</div>
<!-- /table表格区域-->
</a-card>
<!-- 上传图片 -->
<upload-photo-modal ref="uploadPhotoModal" @ok="handleUploadPhotoOk"></upload-photo-modal>
</div>
</template>
<script>
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_organizational_manage.png'
import {JeroListMixin} from '@/mixins/JeroListMixin'
import UploadPhotoModal from '@views/organizationalManage/committeeMemberInfo/modules/UploadPhotoModal'
export default {
name: 'CommitteeMemberInfoList',
components: {UploadPhotoModal, PageHeaderTitle},
mixins: [JeroListMixin],
data () {
return {
disableMixinCreated: true,
isorter: null,
IconImg,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
// 委员会职务下拉
committeePositionList: [
'主任委员',
'副主任委员',
'副主任委员兼秘书长',
'秘书长',
'副秘书长',
'委员',
'顾问',
],
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: 'TC号',
align: 'center',
width: 140,
dataIndex: 'committeeNumber',
scopedSlots: { customRender: 'text' }
},
{
title: '委员姓名',
align: 'center',
width: 140,
dataIndex: 'name',
scopedSlots: { customRender: 'detail' }
},
{
title: '性别',
align: 'center',
width: 140,
dataIndex: 'gender',
scopedSlots: { customRender: 'text' }
},
{
title: '委员会职务',
align: 'center',
width: 140,
dataIndex: 'positionOfStandardsCommittee',
scopedSlots: { customRender: 'text' }
},
{
title: '工作单位',
align: 'center',
width: 140,
dataIndex: 'workUnit',
scopedSlots: { customRender: 'text' }
},
{
title: '单位职务',
align: 'center',
width: 140,
dataIndex: 'administrativePosition',
scopedSlots: { customRender: 'text' }
},
{
title: '聘书编号',
align: 'center',
width: 140,
dataIndex: 'appointmentLetterNumber',
scopedSlots: { customRender: 'text' }
},
{
title: '操作',
dataIndex: '',
align: 'center',
width: 100,
scopedSlots: { customRender: 'action' }
},
],
url: {
list: '/PayCommitteeMemberInfo/page',
exportXlsUrl: '/PayCommitteeMemberInfo/exportXls'
}
}
},
created() {
this.$set(this.queryParam, 'committeeNumber', this.$route.query.committeeNumber)
this.searchQuery()
},
methods: {
// 跳转详情
handleDetail (record) {
this.$router.push({
path: '/organizationalManage/committeeMemberDetail',
query: {
id: record.id
}
})
},
/**
* 上传个人头像
* @param record
*/
uploadPhoto (record) {
this.$refs.uploadPhotoModal.edit(record)
},
/**
* 上传个人头像完成
*/
handleUploadPhotoOk () {
this.loadData()
},
// 下拉框的搜索
filterOption(input, option) {
return (
option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
)
},
handleTableChange(pagination) {
//分页、排序、筛选变化时触发
this.ipagination = pagination
this.loadData()
}
}
}
</script>
<style lang="less" scoped>
@import '~@assets/less/common.less';
.can-click {
cursor: pointer;
color: @primary-color;
}
.table-text {
white-space: nowrap;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
@@ -0,0 +1,102 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item label="个人照片" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-image-upload v-decorator="['photo', validatorRules.photo]" :return-id="true"></j-image-upload>
</a-form-item>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import JImageUpload from '@comp/jero/JImageUpload'
import pick from 'lodash.pick'
import {postAction} from '@api/manage'
export default {
name: 'UploadPhotoModal',
components: {JImageUpload},
data() {
return {
form: this.$form.createForm(this),
title: '操作',
width: 600,
visible: false,
model: {},
labelCol: {
xs: {span: 24},
sm: {span: 5}
},
wrapperCol: {
xs: {span: 24},
sm: {span: 10}
},
confirmLoading: false,
validatorRules: {
photo: {
rules: [{required: true, message: '请上传个人照片'}],
validateTrigger: 'change'
}
},
url: {
edit: '/PayCommitteeMemberInfo/uploadPhoto'
}
}
},
methods: {
add() {
this.edit({})
},
edit(record) {
this.model = Object.assign({}, record)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'photo'))
})
},
close() {
this.form.resetFields()
this.$emit('close')
this.visible = false
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
const formData = Object.assign({ id: this.model.id }, values)
console.log('表单提交数据', formData)
postAction(this.url.edit, formData).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.$emit('ok')
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
that.confirmLoading = false
})
}
})
},
handleCancel() {
this.close()
},
}
}
</script>
<style scoped>
</style>
@@ -279,6 +279,12 @@ const defaultTableColumns = [
width: 140,
dataIndex: 'principalName',
scopedSlots: { customRender: 'text' }
}, {
title: '排序',
align: 'center',
width: 100,
dataIndex: 'sortNo',
scopedSlots: { customRender: 'text' }
}, {
title: '待确收金额',
align: 'center',
@@ -364,7 +370,7 @@ export default {
dataIndex: 'email'
}, {
title: '打包费用总计',
dataIndex: 'packChargeTotal'
dataIndex: 'receivableAmount'
}, {
title: '实际到账费用',
dataIndex: 'receiptExpense'
@@ -146,11 +146,11 @@
</a-col>
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
<j-month-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
date-format="YYYY-MM"
/>
</a-form-item>
</a-col>
@@ -248,12 +248,12 @@ import { addZero } from '../../../utils/util'
import SelectPrincipal from '@comp/company/SelectPrincipal.vue'
import SelectRevenueContract from '@comp/tools/SelectRevenueContract'
import JUpload from '@comp/jero/JUpload'
import JDate from '@comp/tools/JDate'
import JMonthDate from '@comp/tools/JMonthDate'
import {checkAssociatedProject} from '@/utils/projectCheck'
export default {
name: 'PackCompanyModule',
components: {JDate, JUpload, SelectRevenueContract, CompanySelect, SelectContacts, JYearDate, SelectPrincipal },
components: {JMonthDate, JUpload, SelectRevenueContract, CompanySelect, SelectContacts, JYearDate, SelectPrincipal },
props: {
// 合同号是否可编辑
isContractNumDisabled: {
@@ -168,6 +168,12 @@ export default {
width: 280,
dataIndex: 'principalName',
scopedSlots: { customRender: 'text' }
}, {
title: '排序',
align: 'center',
width: 100,
dataIndex: 'sortNo',
scopedSlots: { customRender: 'text' }
},{
title: '企业联系人',
align: 'center',
+13 -2
View File
@@ -98,8 +98,8 @@
<!-- 操作按钮区域 -->
<div class="table-operator">
<!-- <a-button @click="handleAdd" type="primary" icon="plus" v-has="'otherMeeting:add'">新增</a-button>-->
<a-button type="primary" icon="download" @click="handleExportXls('会议汇总')" v-has="'allmeeting:export'">导出
</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('会议汇总')" v-has="'allmeeting:export'">导出</a-button>
<a-button type="primary" @click="handleEnterRecommendHotelPage" v-has="'allmeeting:recommendHotel'">会议酒店推荐</a-button>
<!-- <a-button type="danger" icon="delete" @click="batchDel" v-has="'otherMeeting:batchDel'">批量删除</a-button>-->
<!-- <a-button @click="releaseMeeing" type="primary" v-has="'otherMeeting:release'">发布</a-button>-->
</div>
@@ -151,6 +151,7 @@ import '@/assets/less/TableExpand.less'
import JDate from '@comp/tools/JDate'
import JDictSelectTag from '@comp/dict/JDictSelectTag'
import moment from 'moment'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
name: 'AllMeetingList',
@@ -296,6 +297,10 @@ export default {
pathMap.set('5','/incomePayments/meetManage/AttendanceCommitteeMeeting')
pathMap.set('6','/incomePayments/meetManage/AttendanceCouncilMeeting')
pathMap.set('7','/incomePayments/meetManage/AttendanceDraftGroupMeeting')
//
pathMap.set(MeetingTypeEnums.overseas.value,'/incomePayments/meetManage/AttendanceOverseasMeeting')
//
pathMap.set(MeetingTypeEnums.safetyCenter.value,'/incomePayments/meetManage/AttendanceFunctionalSafetyCenter')
this.$router.push({
path: pathMap.get(record.meetingType+''),
query: {
@@ -330,6 +335,12 @@ export default {
}
return startValue.valueOf() > endValue.valueOf()
},
//
handleEnterRecommendHotelPage() {
this.$router.push({
path: '/projectManagement/allMeetingList/RecommendHotelPage'
})
}
}
}
</script>
@@ -42,14 +42,22 @@
<j-year-date style="width:100%" placeholder="请选择运行年份" v-model="queryParam.year"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-range-picker
style="width: 100%"
v-model="queryParam.estimatedArrivalDate"
format="YYYY-MM-DD"
:placeholder="['开始时间', '结束时间']"
@change="onDateChange"
<j-month-date placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.start]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledStartMonth"
/>
<span class="query-group-split-cust"></span>
<j-month-date placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.end]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledEndMonth"
/>
</a-form-item>
</a-col>
@@ -138,6 +146,7 @@
<span slot="action" class="action-span-cell" slot-scope="text, record">
<!--如果是打包不能编辑-->
<a @click="handleEdit(record)" v-has="'generalProject:edit'" :disabled="record.pack === 1">编辑</a>
<a @click="handleCopy(record)" v-has="'generalProject:copy'">复制</a>
<a @click="handleDelete(record.id)" v-has="'generalProject:delete'">删除</a>
</span>
</a-table>
@@ -159,11 +168,13 @@ import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconProjectManagement from '@/assets/imgs/icon/icon_project_management.png'
import { formatMoney } from '../../utils/formatMoney'
import {getPayConfirmList} from '@api/incomePaymentsApi'
import { MonthRangeMixin } from '../../mixins/MonthRangeMixins'
import JMonthDate from '../../components/tools/JMonthDate'
export default {
name: 'GeneralProjectManagement',
components: { JYearDate, GeneralProjectModule, SelectPrincipal, ProjectDetailModal, StatusSlot, PageHeaderTitle },
mixins: [JeroListMixin],
components: { JYearDate, GeneralProjectModule, SelectPrincipal, ProjectDetailModal, StatusSlot, PageHeaderTitle, JMonthDate },
mixins: [JeroListMixin, MonthRangeMixin],
computed: {
importExcelUrl: function () {
return `${ window._CONFIG['domianURL'] }/${ this.url.importExcelUrl }`
@@ -312,10 +323,12 @@ export default {
this.$refs.basicInfo = basicInfo
this.$refs.projectDetail.open(record)
},
onDateChange: function (value, dateString) {
this.queryParam.estimatedArrivalStartDate = dateString[0]
this.queryParam.estimatedArrivalEndDate = dateString[1]
}
//
handleCopy: function (record) {
this.$refs.modalForm.copy(record)
this.$refs.modalForm.title = '复制'
this.$refs.modalForm.disableSubmit = false
},
}
}
</script>
@@ -0,0 +1,328 @@
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="会议名称">
<a-input placeholder="请输入会议名称" v-model="queryParam.meetingName" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="会议时间">
<j-date
placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam.meetingStartTime"
:disabled-date="disabledStartDate">
</j-date>
<span class="query-group-split-cust"></span>
<j-date
placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam.meetingEndTime"
:disabled-date="disabledEndDate">
</j-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="年份">
<j-year-date style="width: 100%" placeholder="请选择年份" v-model="queryParam.particularYear"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="创建时间">
<j-date
placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam.createTime_begin"
:disabled-date="disabledStartCreateDate">
</j-date>
<span class="query-group-split-cust"></span>
<j-date
placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam.createTime_end"
:disabled-date="disabledEndCreateDate">
</j-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search" v-has="'overseasMeeting:search'">查询</a-button>
<a-button @click="searchReset" icon="reload" class="reset-button" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" icon="plus" v-has="'overseasMeeting:add'">新增</a-button>
<a-button type="primary" icon="download" @click="handleExportXls('海外会议')" v-has="'overseasMeeting:export'">导出
</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'overseasMeeting:batchDel'">批量删除</a-button>
<!--<a-button @click="releaseMeeing" type="primary" v-has="'overseasMeeting:publish'">发布</a-button>-->
</div>
<!-- table区域-begin -->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:scroll="{x:true}"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
class="j-table-force-nowrap"
@change="handleTableChange">
<template slot="htmlSlot" slot-scope="text,record">
<j-ellipsis v-if="text" class="primary-color" @click="toAttendance(record)" :value="text"
:length="20"></j-ellipsis>
<span v-else></span>
</template>
<template slot="text" slot-scope="text">
<j-ellipsis v-if="text" :value="text" :length="20"></j-ellipsis>
<span v-else></span>
</template>
<span slot="action" slot-scope="text, record" class="action-span-cell">
<!--会议需要发布才能让企业人员看见 已发布状态禁用按钮 -->
<!--调整为页面级按钮-->
<!-- <a @click="releaseMeeing(record)" v-has=" '' " :disabled="record.isRelease === 1 ">发布</a>-->
<a @click="handleUploadFile(record,'1')" v-has="'overseasMeeting:uploadCouncil'">会议纪要</a>
<a @click="handleUploadFile(record,'2')" v-has="'overseasMeeting:upload'">上传文件</a>
<!-- <a @click="handleSignup(record)">报名信息</a>-->
<a @click="handleEdit(record)" v-has="'overseasMeeting:edit'">编辑</a>
<a @click="handleDelete(record.id)" v-has="'overseasMeeting:delete'">删除</a>
</span>
</a-table>
</div>
<!-- <meet-modal ref="modalForm" @ok="modalFormOk"></meet-modal>-->
<upload-meet-file-modal ref="modalForm" @ok="modalFormOk"></upload-meet-file-modal>
</a-card>
</div>
</template>
<script>
import {mixinDevice} from '@/utils/mixin'
import {JeroListMixin} from '@/mixins/JeroListMixin'
import {RangeDateMixin} from '@/mixins/RangeDateMixin'
import JYearDate from '@comp/jero/JYearDate'
import UploadMeetFileModal from '@views/incomePayments/meetManage/modules/UploadMeetFileModal'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconImg from '@/assets/imgs/icon/icon_other_meeting.png'
import '@/assets/less/TableExpand.less'
import JDate from '@comp/tools/JDate'
import moment from 'moment'
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
name: 'OverseasMeeting',
mixins: [JeroListMixin, mixinDevice, RangeDateMixin],
components: {
JYearDate,
UploadMeetFileModal,
PageHeaderTitle,
JDate,
},
data() {
return {
description: '海外会议',
IconImg,
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '会议名称',
align: 'center',
dataIndex: 'meetingName',
scopedSlots: {customRender: 'htmlSlot'},
width: 220,
},
{
title: '会议类型',
align: 'center',
dataIndex: 'meetingType_dictText',
width: 120,
scopedSlots: {customRender: 'text'}
},
{
title: '负责人',
align: 'center',
dataIndex: 'directorName',
width: 160,
scopedSlots: {customRender: 'text'},
},
{
title: '召开时间',
align: 'center',
dataIndex: 'startTime',
width: 220,
customRender: (text, record) => (
<j-ellipsis value={record.startTime + '~' + record.endTime} length={20}></j-ellipsis>)
},
{
title: '召开地点',
align: 'center',
dataIndex: 'venue',
width: 240,
customRender: (text, record) => (<j-ellipsis value={text + '/' + record.address} length={20}></j-ellipsis>)
},
{
title: '年份',
align: 'center',
dataIndex: 'particularYear',
width: 120,
scopedSlots: {customRender: 'text'}
},
{
title: '创建时间',
align: 'center',
dataIndex: 'createTime',
scopedSlots: {customRender: 'text'}
},
{
title: '操作',
align: 'center',
fixed: 'right',
width: 180,
scopedSlots: {customRender: 'action'}
},
],
dateKeyObj: {
beginKey: 'meetingStartTime',
endKey: 'meetingEndTime'
},
url: {
list: '/meeting/overseas/page',
delete: '/meeting/overseas/delete',
deleteBatch: '/meeting/overseas/deleteBatch',
exportXlsUrl: '/meeting/overseas/exportXls',
releaseMeeingUrl: '/meeting/overseas/publishReminder'//
},
disableMixinCreated: true
}
},
created() {
this.filters.meetingType = MeetingTypeEnums.overseas.value
this.loadData(1)
},
methods: {
/*
* 上传会议文件
* */
handleUploadFile(record, type) {
this.$refs.modalForm.edit(record, type)
},
/*
* 报名信息
* */
handleSignup() {
this.$router.push({
path: '/incomePayments/meetManage/SignUpInfoList'
})
},
/*
* 修改查询条件
* */
searchQuery() {
// this.queryParam.meetingStartTime = this.queryParam.meetingStartTime ? this.queryParam.meetingStartTime + ' ' + '00:00:00' : undefined
// this.queryParam.meetingEndTime = this.queryParam.meetingEndTime ? this.queryParam.meetingEndTime + ' ' + '23:59:59' : undefined
// this.queryParam.createTime_begin = this.queryParam.createTime_begin ? this.queryParam.createTime_begin + ' ' + '00:00:00' : undefined
// this.queryParam.createTime_end = this.queryParam.createTime_end ? this.queryParam.createTime_end + ' ' + '23:59:59' : undefined
this.lastQueryParam = {...this.queryParam}
if(this.lastQueryParam.meetingStartTime) this.lastQueryParam.meetingStartTime = this.lastQueryParam.meetingStartTime + ' ' + '00:00:00'
if(this.lastQueryParam.meetingEndTime) this.lastQueryParam.meetingEndTime = this.lastQueryParam.meetingEndTime + ' ' + '23:59:59'
if(this.lastQueryParam.createTime_begin) this.lastQueryParam.createTime_begin = this.lastQueryParam.createTime_begin + ' ' + '00:00:00'
if(this.lastQueryParam.createTime_end) this.lastQueryParam.createTime_end = this.lastQueryParam.createTime_end + ' ' + '23:59:59'
this.loadData(1)
},
/*
* 编辑
* /incomePayments/meetManage/AddOrDetailMeet
* */
handleEdit(record) {
this.$router.push({
path: '/incomePayments/meetManage/AddOrDetailMeet',
query: {
id: record.id,
}
})
},
/*
* 新增
* */
handleAdd() {
this.$router.push({
path: '/incomePayments/meetManage/AddOrDetailMeet',
query: {
meetingType: MeetingTypeEnums.overseas.value
}
})
},
/*
* 参会情况
* */
toAttendance(record) {
this.$router.push({
path: '/incomePayments/meetManage/AttendanceOverseasMeeting',
query: {
id: record.id,
meetingName: record.meetingName,
meetingType: MeetingTypeEnums.overseas.value
}
})
},
/*
* 创建时间开始禁用
* */
disabledStartCreateDate(startValue) {
const endValue = this.queryParam.createTime_end && moment(this.queryParam.createTime_end, this.rangeDateFormat.end)
if (!startValue || !endValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
/*
* 创建时间结束禁用
* */
disabledEndCreateDate(endValue) {
const startValue = this.queryParam.createTime_begin && moment(this.queryParam.createTime_begin, this.rangeDateFormat.begin)
if (!endValue || !startValue) {
return false
}
return startValue.valueOf() > endValue.valueOf()
},
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
.primary-color {
color: #069f99;
cursor: pointer;
}
</style>
@@ -0,0 +1,228 @@
<!--会议酒店推荐-->
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="推荐人">
<a-input placeholder="请输入推荐人" v-model="queryParam.recommendPeople" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="酒店名称">
<a-input placeholder="请输入酒店名称" v-model="queryParam.hotelName" ></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="所在省份">
<a-input placeholder="请输入所在省份" v-model="queryParam.hotelProvince" ></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="所在城市">
<a-input placeholder="请输入所在城市" v-model="queryParam.hotelCity" ></a-input>
</a-form-item>
</a-col>
<!--是否-->
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否举办过标准院会议">
<j-dict-select-tag style="width: 100%"
dict-code="yn"
v-model="queryParam.isHold"
placeholder="请选择是否举办过标准院会议"></j-dict-select-tag>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="曾举办会议类型">
<a-input placeholder="请输入曾举办会议类型" v-model="queryParam.meetingType" ></a-input>
<!--<j-dict-select-tag style="width: 100%"-->
<!-- dict-code="meeting_type"-->
<!-- v-model="queryParam.meetingType"-->
<!-- placeholder="请选择曾举办会议类型"></j-dict-select-tag>-->
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="酒店联系方式">
<a-input placeholder="请输入酒店联系方式" v-model="queryParam.contact" ></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="备注">
<a-input placeholder="请输入备注" v-model="queryParam.remark" ></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search" v-has="'recommendHotelPage:list'">查询</a-button>
<a-button @click="searchReset" icon="reload" class="reset-button" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 查询区域-END -->
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
@change="handleImportExcel" v-has="'recommendHotelPage:import'">
<a-button type="primary" icon="import">导入</a-button>
</a-upload>
<a-button type="primary" icon="download" @click="downTemplate('会议酒店推荐导入模板')" v-has="'recommendHotelPage:downTemplate'">
下载模板
</a-button>
</div>
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:scroll="{x:1600}"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
class="j-table-force-nowrap"
@change="handleTableChange">
<template slot="text" slot-scope="text">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
<a @click="handleDetail(record)">查看</a>
</span>
</a-table>
</div>
<recommend-hotel-modal ref="modal"></recommend-hotel-modal>
</a-card>
</div>
</template>
<script>
import {JeroListMixin} from '@/mixins/JeroListMixin'
import IconImg from '@/assets/imgs/icon/icon_other_meeting.png'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import RecommendHotelModal from './modules/RecommendHotelModal'
export default {
name: 'RecommendHotelPage',
mixins: [JeroListMixin],
components: {
PageHeaderTitle,
RecommendHotelModal
},
data() {
return {
description: '会议酒店推荐',
IconImg,
columns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '推荐人',
align: 'center',
dataIndex: 'recommendPeople',
scopedSlots: {customRender: 'text'},
width: 80,
},
{
title: '酒店名称',
align: 'center',
dataIndex: 'hotelName',
scopedSlots: {customRender: 'text'},
width: 100,
},
{
title: '所在省份',
align: 'center',
dataIndex: 'hotelProvince',
scopedSlots: {customRender: 'text'},
width: 80,
},
{
title: '所在城市',
align: 'center',
dataIndex: 'hotelCity',
scopedSlots: {customRender: 'text'},
width: 80,
},
{
title: '是否举办过标准院会议',
align: 'center',
dataIndex: 'isHold_dictText',
scopedSlots: {customRender: 'text'},
width: 100,
},
{
title: '曾举办会议类型',
align: 'center',
dataIndex: 'meetingType',
scopedSlots: {customRender: 'text'},
width: 100,
},
{
title: '酒店联系方式',
align: 'center',
dataIndex: 'contact',
scopedSlots: {customRender: 'text'},
width: 100,
},
{
title: '备注',
align: 'center',
dataIndex: 'remark',
scopedSlots: {customRender: 'text'},
width: 150
},
{
title: '操作',
dataIndex: 'action',
align: 'center',
// fixed: 'right',
width: 80,
scopedSlots: { customRender: 'action' }
}
],
url: {
list: '/meeting/payMeetingHotelRecommend/page',
importExcelUrl: '/meeting/payMeetingHotelRecommend/importXls',
downTemplateUrl: '/meeting/payMeetingHotelRecommend/exportTemplate',
},
}
},
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
},
},
methods: {
handleDetail(record) {
this.$refs.modal.open(record)
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
</style>
@@ -70,14 +70,38 @@
<a-input placeholder="请输入标签名称" v-model="queryParam.label" :maxLength='50'></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-range-picker
style="width: 100%"
v-model="queryParam.estimatedArrivalDate"
format="YYYY-MM-DD"
:placeholder="['开始时间', '结束时间']"
@change="onDateChange"
<j-month-date placeholder="请选择开始日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.start]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledStartMonth"
/>
<span class="query-group-split-cust"></span>
<j-month-date placeholder="请选择结束日期"
class="query-group-cust"
v-model="queryParam[rangeMonthKey.end]"
:trigger-change="true"
date-format="YYYY-MM"
:disabled-date="disabledEndMonth"
/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否审核" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="queryParam.checkPaymentStatus"
placeholder="请选择是否审核"
dictCode="yn"
/>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否查看凭证" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="queryParam.confirmVoucher"
placeholder="请选择是否查看凭证"
dictCode="yn"
/>
</a-form-item>
</a-col>
@@ -196,6 +220,7 @@
<a @click="handleEditAccount(record)" :disabled="isAllowEditAccount(record)" v-has="'workingGroupMember:editAccount'">调账</a>
<a @click="handleEdit(record)" v-has="'workingGroupMember:edit'">编辑</a>
<a @click="handleDelete(record.id)" v-has="'workingGroupMember:delete'">删除</a>
<a @click="lookVoucher(record)" v-show="!!record.paymentStatus" v-has="'workingGroupMember:confirmVoucher'">查看凭证</a>
</span>
</a-table>
</div>
@@ -209,6 +234,8 @@
<email-error-msg-modal ref="emailError"></email-error-msg-modal>
<work-group-set-label ref="workGroupSetLabel" @ok="modalFormOk"></work-group-set-label>
<!--查看凭证-->
<look-voucher-modal ref="lookVoucherModal" @ok="modalFormOk"></look-voucher-modal>
</div>
</template>
@@ -228,6 +255,10 @@ import EmailErrorMsgModal from './modules/EmailErrorMsgModal'
import WorkGroupSetLabel from './modules/WorkGroupSetLabel'
import { formatMoney } from '../../utils/formatMoney'
import {YesOrNoEnums} from '@/enums/commonEnums'
import { MonthRangeMixin } from '../../mixins/MonthRangeMixins'
import { getAction } from '../../api/manage'
import JMonthDate from '../../components/tools/JMonthDate'
import LookVoucherModal from './modules/LookVoucherModal'
// eslint-disable-next-line no-undef,no-unused-vars
const Base64 = require('js-base64').Base64
@@ -243,9 +274,11 @@ export default {
WorkingGroupMemberSetChargeNotice,
PreviewFile,
EmailErrorMsgModal,
WorkGroupSetLabel
WorkGroupSetLabel,
JMonthDate,
LookVoucherModal
},
mixins: [JeroListMixin],
mixins: [JeroListMixin, MonthRangeMixin],
computed: {
importExcelUrl: function () {
return `${ window._CONFIG['domianURL'] }/${ this.url.importExcelUrl }`
@@ -307,7 +340,9 @@ export default {
deleteBatch: '/project/payWorkingGroupSubitem/deleteBatch',
exportXlsUrl: '/project/payWorkingGroupSubitem/exportXls',
importExcelUrl: '/project/payWorkingGroupSubitem/importExcel',
downTemplateUrl: '/project/payWorkingGroupSubitem/downloadExcelModel'
downTemplateUrl: '/project/payWorkingGroupSubitem/downloadExcelModel',
//
confirmVoucher: '/project/payWorkingGroupSubitem/confirmVoucher'
},
columns: [
{
@@ -375,7 +410,24 @@ export default {
width: 80,
dataIndex: 'pack',
scopedSlots: { customRender: 'status-pack' }
}, {
},
{
title: '查看凭证',
align: 'center',
fixed: 'right',
dataIndex: 'confirmVoucher',
width: 100,
scopedSlots: { customRender: 'status-pack' }
},
{
title: '审核',
align: 'center',
fixed: 'right',
dataIndex: 'checkPaymentStatus',
width: 100,
scopedSlots: { customRender: 'status-pack' }
},
{
title: '需要发票',
align: 'center',
fixed: 'right',
@@ -408,7 +460,7 @@ export default {
dataIndex: 'action',
align: 'center',
fixed: 'right',
width: 180,
width: 220,
scopedSlots: { customRender: 'action' }
}
],
@@ -463,14 +515,6 @@ export default {
}
})
},
// --
searchQuery() {
this.lastQueryParam = {...this.queryParam}
if(this.lastQueryParam.estimatedArrivalDate) {
delete this.lastQueryParam.estimatedArrivalDate
}
this.loadData(1)
},
/**
* 初始化工作组信息
*/
@@ -636,6 +680,31 @@ export default {
onDateChange: function (value, dateString) {
this.queryParam.estimatedArrivalStartDate = dateString[0]
this.queryParam.estimatedArrivalEndDate = dateString[1]
},
//
lookVoucher(record) {
this.$refs.lookVoucherModal.open(record)
},
confirmVoucher(id) {
var that = this
this.$confirm({
title: '确认',
content: '确定要确认此条数据凭证吗?',
onOk: function () {
getAction(that.url.confirmVoucher, {id: id}).then((res) => {
if (res.success) {
that.$message.success(res.message)
that.loadData()
} else {
if (res.message.indexOf('<br/>') > -1) {
that.messageLineFeed('确认凭证失败', res.message)
} else {
that.$message.warning(res.message)
}
}
})
}
})
}
// 2021 10 11
// searchReset() {
@@ -57,7 +57,7 @@
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record" v-if="canOperate">
<a @click="handleDistribute(record.id)" v-has="'fileMaintenance:distribute'">分发</a>
<a @click="handleDistribute(record)" v-has="'fileMaintenance:distribute'">分发</a>
<a @click="handleDownload(record)" v-has="'fileMaintenance:download'">下载</a>
<a @click="handleDelete(record.id)" v-has="'fileMaintenance:delete'">删除</a>
</span>
@@ -79,6 +79,7 @@
:project-type="projectType"
:is-batch="isBatchDistribute"
:record-id="dataId"
:file-id="fileId"
@ok="modalFormOk"></work-group-distribute-module>
</div>
</template>
@@ -158,6 +159,7 @@ export default {
distributeModalVisible: false,
isBatchDistribute: false,
dataId: '', // id
fileId: '', // id,
canOperate: true // B
}
},
@@ -184,6 +186,11 @@ export default {
this.canOperate = this.$route.query.canOperate === 'true'
this.projectType = 4
this.filters.projectType = 4
} else if (this.$route.query.hasOwnProperty.call(this.$route.query, 'safetyCenterId')) {
//
this.filters.projectId = this.$route.query.safetyCenterId
this.projectType = 5
this.filters.projectType = 5
}
this.projectId = this.filters.projectId
this.loadData()
@@ -204,8 +211,9 @@ export default {
/**
* 分发
*/
handleDistribute(id) {
this.dataId = id
handleDistribute(record) {
this.fileId = record.fileId
this.dataId = record.id
this.distributeModalVisible = true
this.isBatchDistribute = false
},
@@ -48,6 +48,7 @@
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'workingGroupProject:add'">新增</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'workingGroupProject:batchDel'">批量删除</a-button>
<a-button type="primary" icon="plus" @click="handleBatchAddMemberUnit" v-has="'workingGroupMember:batchAdd'">批量新增成员单位</a-button>
<a-button type="primary" icon="download" @click="handleExportAllFile" v-has="'workingGroupProject:exportAllFile'">全部文件导出</a-button>
<!-- 进度条tooltip-->
<div class="tooltip">
@@ -103,7 +104,10 @@
</template>
<template slot="text" slot-scope="text">
<j-ellipsis :value="text" :length="20"></j-ellipsis>
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<span slot="action" class="action-span-cell" slot-scope="text, record">
@@ -133,7 +137,7 @@ import ProgressBar from '@comp/ProgressBar'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import IconWorkingGruop from '@/assets/imgs/icon/icon_working_group.png'
import { copyWorkingGroup } from '../../api/incomePaymentsApi'
import { getAction } from '../../api/manage'
import { downloadFile, getAction } from '../../api/manage'
import WorkingGroupMemberUnitModule from '@views/projectManagement/modules/WorkingGroupMemberUnitModule'
export default {
@@ -154,7 +158,8 @@ export default {
url: {
list: '/project/payWorkingGroup/list',
delete: '/project/payWorkingGroup/delete',
deleteBatch: '/project/payWorkingGroup/deleteBatch'
deleteBatch: '/project/payWorkingGroup/deleteBatch',
exportAllFileUrl: '/project/payWorkingGroup/exportAllFile',
},
columns: [
{
@@ -176,6 +181,12 @@ export default {
align: 'center',
width: 130,
dataIndex: 'principalNameA'
}, {
title: '排序',
align: 'center',
width: 100,
dataIndex: 'sortNo',
scopedSlots: { customRender: 'text' }
}, {
title: '收款进度',
align: 'center',
@@ -197,6 +208,11 @@ export default {
lastQueryParam: {
year: new Date().getFullYear().toString()
},
/* 排序参数 */
isorter: {
column: 'sortNo', //
order: 'asc',
},
operateData: [] // 使
}
},
@@ -207,6 +223,16 @@ export default {
this.$refs.workingGroupMemberUnitModule.title = '批量新增成员单位'
this.$refs.workingGroupMemberUnitModule.disableSubmit = false
},
//
handleExportAllFile () {
const fileName = '导出工作组全部文件'
let param = this.getQueryParams()
if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
param['selections'] = this.selectedRowKeys.join(',')
}
console.log('导出参数', param)
downloadFile(this.url.exportAllFileUrl, fileName + '.zip', param)
},
loadData(arg) {
if (!this.url.list) {
this.$message.error('请设置url.list属性!')
@@ -143,11 +143,11 @@
<a-row>
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
<j-month-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
date-format="YYYY-MM"
/>
</a-form-item>
</a-col>
@@ -254,11 +254,12 @@ import { USER_INFO } from '../../../store/mutation-types'
import { money } from '../../../utils/validate'
import { checkAssociatedProject } from '../../../utils/projectCheck'
import SelectRevenueContract from '../../../components/tools/SelectRevenueContract'
import JDate from '@/components/tools/JDate'
import JMonthDate from '@/components/tools/JMonthDate'
import { OpeTypeEnums } from '../../../enums/commonEnums'
export default {
name: 'GeneralProjectModule',
components: { JYearDate, JUpload, JDate,CompanySelect, SelectPrincipal, SelectContacts, SelectRevenueContract ,JDictSelectTag},
components: { JYearDate, JUpload, JMonthDate,CompanySelect, SelectPrincipal, SelectContacts, SelectRevenueContract ,JDictSelectTag},
props: {
//
defaultChargeCompany: {
@@ -406,6 +407,7 @@ export default {
selectedMailContact: null, //
disabledCompany: false, //
isAssociatedContract: false, //
opeType: OpeTypeEnums.add.value, //
url: {
add: '/project/payCommonProject/add',
edit: '/project/payCommonProject/edit'
@@ -415,6 +417,7 @@ export default {
methods: {
addZero,
add() {
this.opeType = OpeTypeEnums.add.value
this.edit({})
if (this.defaultChargeWay === 2) {
this.chargeWayType = 2
@@ -426,6 +429,13 @@ export default {
})
}
},
copy(record) {
this.opeType = OpeTypeEnums.copy.value
let params = {...record}
delete params.id
console.log('------params-------', params)
this.edit(params)
},
edit(record) {
if (this.defaultChargeCompany.hasOwnProperty.call(this.defaultChargeCompany, 'id')) {
record.chargeCompany = {
@@ -456,7 +466,7 @@ export default {
record.contractNum = record.contractNum || undefined
this.form.resetFields()
this.model = Object.assign({}, record)
if (this.model.id) {
if (this.model.id || this.opeType === OpeTypeEnums.copy.value) {
this.selectedContact = {
id: this.model.contactsTemporaryId,
name: this.model.contactsTemporaryName
@@ -0,0 +1,259 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<div class="project-name">
<!--<div>{{ model.chargeProject }}</div>-->
<div>{{ model.chargeCompanyTemporaryName }}</div>
</div>
<h3 class="title">凭证信息</h3>
<div class="basic-info-div">
<!--其他项目的显示 -->
<template >
<a-form-item label="缴费金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.amountReceived }}</div>
</a-form-item>
</template>
<a-form-item label="缴费日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.paymentDate }}</div>
</a-form-item>
<a-form-item label="申请人" :labelCol="labelCol" :wrapperCol="wrapperCol">
<div>{{ proofInfo.applicantName }}</div>
</a-form-item>
<a-form-item v-if="proofType!=='pdf'" class="proof-form-item" :label="'缴费凭证'" :labelCol="labelCol"
:wrapperCol="wrapperCol">
<div class="proof-img" v-if="proofType === 'img'">
<template v-if="proofInfo.proof && proofInfo.proof !== ''">
<div class="proof-img-item" v-for="(item, index) in proofInfo.proof.split(',')" :key="index">
<img :src="proofSrc(item)" @click="previewImg(item)">
</div>
</template>
</div>
<span v-if="proofType==='none'"></span>
</a-form-item>
</div>
</a-spin>
<template slot="footer">
<a-button @click="handleCancel">关闭</a-button>
<!--<a-button type="primary" @click="handleOk" v-preventclick>确定</a-button>-->
</template>
<!-- 缴费凭证预览-->
<preview-img-modal ref="previewImg"></preview-img-modal>
</j-modal>
</template>
<script>
import { getAction } from '../../../api/manage'
import PreviewImgModal from '@/components/PreviewImgModal'
const labelCol = {
xs: {span: 24},
sm: {span: 3}
}
const wrapperCol = {
xs: {span: 24},
sm: {span: 21}
}
export default {
name: 'LookVoucherModal',
components: {PreviewImgModal},
data() {
return {
title: '查看凭证',
width: 600,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol,
wrapperCol,
labelPayCol: {
xs: {span: 24},
sm: {span: 8}
},
wrapperPayCol: {
xs: {span: 24},
sm: {span: 16}
},
url: {
// -
confirmVoucher: '/project/payWorkingGroupSubitem/confirmVoucher',
//
getLastProof: '/paymentCheck/payPaymentCheck/getLastProof',
},
//
proofInfo: {},
//
showInstructions: false,
// imgpaymentMethod1--2--pdf3--
proofType: 'img'
}
},
methods: {
/**
* 打开弹框 需要调用 查看凭证的方法
* @param record-项目的record
*/
open(record) {
this.model = Object.assign({}, record)
//
this.getLastProof(record.id)
//
this.lookVoucher(record.id)
this.visible = true
},
close() {
this.$emit('close')
this.visible = false
this.model = {}
},
handleCancel() {
this.close()
this.$emit('ok')
},
//
lookVoucher(id) {
getAction(this.url.confirmVoucher, {id: id}).then((res) => {
if (res.success) {
// this.$message.success(res.message)
} else {
if (res.message.indexOf('<br/>') > -1) {
this.messageLineFeed('查看凭证失败', res.message)
} else {
this.$message.warning(res.message)
}
}
})
},
/**
* 获取最新一条缴费凭证
* @param id-项目ID
*/
getLastProof(id) {
this.confirmLoading = true
let param = {
projectId: id
}
getAction(this.url.getLastProof, param).then((res) => {
if (res.success && res.result !== '无数据') {
this.proofInfo = res.result || {}
} else {
this.proofInfo = {}
}
}).finally(() => {
this.confirmLoading = false
})
},
/**
* 缴费凭证 src
*/
proofSrc(imgId) {
return `${window._CONFIG['domianURL']}/sys/common/download/${imgId}`
},
/**
* 预览缴费凭证
*/
previewImg(imgId) {
this.$refs.previewImg.title = '缴费凭证'
this.$refs.previewImg.imgId = imgId
this.$refs.previewImg.visible = true
},
/**
* 获取缴费凭证类型
* @param record
*/
getProofType(record) {
if (record.projectType && (record.projectType.toString() === '6')) {
if (this.proofInfo.paymentMethod.toString() === '1' || this.proofInfo.paymentMethod.toString() === '3') {
this.proofType = 'img'
return
}
if (this.proofInfo.paymentMethod.toString() === '2') {
this.proofType = 'pdf'
return
}
if (this.proofInfo.paymentMethod.toString() === '3') {
this.proofType = 'none'
return
}
} else {
this.proofType = 'img'
}
},
}
}
</script>
<style scoped lang="less">
.ant-form-item {
margin-bottom: 10px;
}
.project-name {
font-size: 16px;
line-height: 30px;
font-weight: 700;
padding-bottom: 10px;
}
h3 {
position: relative;
}
h3.title::before {
position: absolute;
top: 4px;
left: -10px;
content: "";
height: 20px;
width: 2px;
background: #069f99;
}
.info-item {
display: flex;
padding: 5px 0;
label {
color: #666666;
flex-shrink: 0;
display: inline-block;
width: 4.5rem;
text-align: right;
}
div {
color: black;
}
}
//
.proof-img {
display: flex;
width: calc(100% - 4rem);
&-item {
width: 21%;
img {
max-width: 100%;
max-height: 150px;
cursor: pointer;
}
}
}
//
.basic-info-div {
/deep/ .ant-form-item:not(.proof-form-item) {
margin-bottom: 0;
}
}
</style>
@@ -51,6 +51,10 @@
</a-row>
</a-form>
</div>
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" @click="checkAll()">全选</a-button>
</div>
<a-table
ref="table"
size="middle"
@@ -92,7 +96,9 @@ import {
draftGroupPublishRemind
} from '@api/incomePaymentsApi'
import EmailErrorMsgModal from '@views/projectManagement/modules/EmailErrorMsgModal'
import { judgeEmailStatus } from "../../../api/incomePaymentsApi";
import { judgeEmailStatus } from '../../../api/incomePaymentsApi'
import { getAction } from "../../../api/manage";
import {MeetingTypeEnums} from '@/enums/commonEnums'
export default {
@@ -232,6 +238,47 @@ export default {
// scopedSlots: {customRender: 'text'}
},
],
//
safetyCenterColumns: [
{
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
},
{
title: '成员单位',
align: 'center',
width: 200,
dataIndex: 'companyName',
scopedSlots: {customRender: 'text'}
},
{
title: '企业联系人',
align: 'center',
width: 200,
dataIndex: 'contactsName',
scopedSlots: {customRender: 'text'}
},
{
title: '是否提醒',
align: 'center',
width: 200,
dataIndex: 'remind_dictText',
// scopedSlots: {customRender: 'text'}
},
{
title: '邮件提醒',
align: 'center',
width: 200,
dataIndex: 'mailRemind_dictText',
// scopedSlots: {customRender: 'text'}
},
],
model: {},
labelCol: {
xs: {span: 24},
@@ -284,6 +331,12 @@ export default {
this.filters.draftingGroupId = this.$route.query.draftingGroupProjectId
this.newColumns = [...this.columns]
this.remindType = 4
} else if (this.$route.query.meetingType === MeetingTypeEnums.safetyCenter.value) {
//
this.url.list = '/SafetyCenterSubitem/publishReminderList'
this.filters.projectId = this.$route.query.projectId
this.newColumns = [...this.safetyCenterColumns]
this.remindType = 5
} else {
// id
this.filters.workingGroupId = this.$route.query.workingGroupProjectId
@@ -339,6 +392,10 @@ export default {
//
param.draftingGroupId = this.$route.query.draftingGroupProjectId
requestFun = draftGroupPublishRemind
} else if (this.$route.query.meetingType === MeetingTypeEnums.safetyCenter.value) {
//
param.safetyCenterId = this.$route.query.projectId
requestFun = draftGroupPublishRemind
} else {
//
param.workingGroupId = this.$route.query.workingGroupProjectId
@@ -403,8 +460,31 @@ export default {
this.needMail = (res.result || {}).templateType.indexOf(2) > -1
}
})
}
},
checkAll() {
this.getAllData()
},
getAllData() {
var params = this.getQueryParams()//
params.pageNo = 1
params.pageSize = -1
this.loading = true
getAction(this.url.list, params).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for------------
let dataSource = res.result.records || res.result
this.selectedRowKeys = dataSource.map(tt => tt.id)
this.selectionRows = dataSource
//update-end---author:zhangyafei Date:20201118 for------------
}
if (res.code === 510) {
this.$message.warning(res.message)
}
this.loading = false
}).finally(() => {
this.loading = false
})
},
}
}
</script>
@@ -0,0 +1,123 @@
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@cancel="handleCancel"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<template v-if="dataSource && dataSource !== {}">
<div class="detail-container">
<div :class="item.class + ' detail-line'" v-for="item in columns" :key="item.dataIndex">
<label>{{ item.title }}</label>
<span>{{ dataSource[item.dataIndex] }}</span>
</div>
</div>
</template>
<a-empty v-else></a-empty>
</a-spin>
<template slot="footer">
<a-button @click="handleCancel">关闭</a-button>
</template>
</j-modal>
</template>
<script>
export default {
name: 'RecommendHotelModal',
data() {
return {
title: '查看',
width: 700,
visible: false,
confirmLoading: false,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 17 }
},
dataSource: {},
columns: [
{
title: '推荐人',
dataIndex: 'recommendPeople'
},
{
title: '酒店名称',
dataIndex: 'hotelName'
},
{
title: '所在省份',
dataIndex: 'hotelProvince'
},
{
title: '所在城市',
dataIndex: 'hotelCity'
},
{
title: '是否举办过标准院会议',
dataIndex: 'isHold_dictText'
},
{
title: '曾举办会议类型',
dataIndex: 'meetingType'
},
{
title: '酒店联系方式',
class: 'full-width',
dataIndex: 'contact'
},
{
title: '备注',
class: 'full-width',
dataIndex: 'remark'
}
]
}
},
methods: {
/**
* 打开弹窗
* @param record
*/
open(record) {
this.visible = true
this.dataSource = Object.assign({}, record)
},
handleCancel() {
this.visible = false
this.dataSource = Object.assign({}, {})
}
}
}
</script>
<style scoped lang="less">
.detail-container{
display: flex;
flex-wrap: wrap;
flex-direction: row;
}
.detail-line {
width: 50%;
padding: 8px 20px;
display: flex;
label {
flex-shrink: 0;
}
span {
white-space: pre-wrap;
}
}
.full-width{
width: 100%;
}
</style>
@@ -207,6 +207,12 @@ export default {
type: Boolean,
required: false,
default: false
},
// Id
fileId: {
type: String,
required: false,
default: null
}
},
watch: {
@@ -265,7 +271,7 @@ export default {
}
// id
if(!this.isBatch) {
param.fileId = this.recordId
param.fileId = this.fileId
}
distributeMemberList(param).then(res => {
if (res.success) {
@@ -28,7 +28,7 @@
</a-col>
</a-row>
<!-- 批量添加时显示 -->
<!--todo 样式得调整左侧和下面的成员单位应该保持一致-->
<!--样式得调整左侧和下面的成员单位应该保持一致-->
<template v-if="isBatchAdd && model.workingGroupIdList && model.workingGroupIdList.length > 0">
<a-row v-for="(_, index) in model.workingGroupIdList" :key="index + ''">
<!-- 对齐其他表单单独设置col样式 -->
@@ -209,7 +209,8 @@
</a-form-item>
</a-col>
</a-row>
<template v-if="chargeWayType === 1 || chargeWayType === 2">
<!--2024-07-03 去掉待确收金额相关数据-->
<template v-if="!isBatchAdd && (chargeWayType === 1 || chargeWayType === 2)">
<a-row>
<a-col :xl="12" :sm="24">
<a-form-item label="待确收金额" :labelCol="labelCol" :wrapperCol="wrapperCol">
@@ -270,14 +271,15 @@
</a-row>
</template>
<a-row>
<a-col :xl="12" :sm="24">
<a-form-item label="预估到账日期" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-date placeholder="请选择预估到账日期"
<j-month-date placeholder="请选择预估到账日期"
style="width: 100%;"
v-decorator="['estimatedArrivalDate', validatorRules.estimatedArrivalDate]"
:trigger-change="true"
date-format="YYYY-MM-DD"
date-format="YYYY-MM"
/>
</a-form-item>
</a-col>
@@ -435,12 +437,13 @@ import { checkAssociatedProject } from '../../../utils/projectCheck'
import SelectRevenueContract from '../../../components/tools/SelectRevenueContract'
import JDictSelectTag from '@comp/dict/JDictSelectTag'
import { CalcAmountMixin } from '@/mixins/CalcAmountMixin'
import JMonthDate from '@/components/tools/JMonthDate'
import JDate from '@/components/tools/JDate'
import {getAllWorkProjects} from '@api/incomeMeetingApi'
export default {
name: 'WorkingGroupMemberUnitModule',
components: { JUpload, JDate, CompanySelect, SelectContacts, SelectRevenueContract, JDictSelectTag },
components: { JUpload, JDate, JMonthDate, CompanySelect, SelectContacts, SelectRevenueContract, JDictSelectTag },
mixins: [CalcAmountMixin],
props: {
// 2--
@@ -1086,8 +1089,8 @@ export default {
* @param index
*/
handleAddContact(index) {
if (this.model.payWorkingGroupSubItemContactsList.length >= 10) {
this.$message.warn('最多添加十个企业联系人')
if (this.model.payWorkingGroupSubItemContactsList.length >= 20) {
this.$message.warn('最多添加十个企业联系人')
return
}
let obj = {
@@ -15,14 +15,20 @@
</span>
<a-form :form="form">
<a-row>
<a-col :span="24">
<a-form-item label="工作组项目" :labelCol="remarksLabelCol" :wrapperCol="remarksWrapperCol">
<a-col :span="12">
<a-form-item label="工作组项目" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input placeholder="请输入工作组项目"
v-decorator="['workingGroupProject',validatorRules.workingGroupProject]"
:maxLength='50'
@change="e => {e.target.value = (e.target.value + '').trim()}"></a-input>
</a-form-item>
</a-col>
<!--排序顺序自定义-->
<a-col :span="12" >
<a-form-item label="排序" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input-number placeholder="请输入排序" :min="1" :max="99999" style="width: 200px" v-decorator="[ 'sortNo',validatorRules.sortNo]" />
</a-form-item>
</a-col>
</a-row>
<a-row>
<a-col :span="12">
@@ -217,6 +223,10 @@ export default {
rules: [{ required: true, message: '请输入项目名称' }],
validateTrigger: 'blur'
},
sortNo: {
rules: [{ required: true, message: '请输入排序' }],
validateTrigger: 'blur'
},
year: {
rules: [{ required: true, message: '请选择运行年份' }],
validateTrigger: 'change'
@@ -257,7 +267,7 @@ export default {
this.model = Object.assign({}, record)
this.visible = true
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'workingGroupProject', 'year', 'payFlag', 'principalIdA', 'principalIdB', 'convokeNum', 'operationCycle', 'yearChargeA', 'chargeNoticeNoA', 'chargeNoticeAId', 'yearChargeB', 'chargeNoticeNoB', 'chargeNoticeBId', 'missionAndObjectives', 'remarks'))
this.form.setFieldsValue(pick(this.model, 'workingGroupProject', 'sortNo', 'year', 'payFlag', 'principalIdA', 'principalIdB', 'convokeNum', 'operationCycle', 'yearChargeA', 'chargeNoticeNoA', 'chargeNoticeAId', 'yearChargeB', 'chargeNoticeNoB', 'chargeNoticeBId', 'missionAndObjectives', 'remarks'))
if (!this.model.id) {
this.form.setFieldsValue({
'year': (new Date().getFullYear()).toString(),
@@ -13,8 +13,8 @@
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="确认年份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-year-date style="width:100%" placeholder="请选择确认年份" v-model="queryParam.paymentYear"></j-year-date>
<a-form-item label="项目年份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-year-date style="width:100%" placeholder="请选择项目年份" v-model="queryParam.year"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24" class="flex-width-zero">
@@ -58,6 +58,12 @@
@change="handleTableChange"
:class="dataSource.length === 0 ? 'show-scroll' : ''"
class="j-table-force-nowrap main-table">
<template slot="htmlSlot" slot-scope="text,record">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text primary-color" @click="toAttendance(record)">{{ text }}</div>
</a-tooltip>
</template>
<template slot="text" slot-scope="text">
<a-tooltip>
@@ -119,6 +125,7 @@ import JYearDate from '@/components/jero/JYearDate'
import { getAction } from '@api/manage'
import {formatMoney} from '@/utils/formatMoney'
import { MonthData } from './statisticData'
import { MeetingTypeEnums } from '../../enums/commonEnums'
const defaultTableColumns = [
{
@@ -126,7 +133,7 @@ const defaultTableColumns = [
align: 'center',
width: 160,
dataIndex: 'meetingName',
scopedSlots: { customRender: 'text' }
scopedSlots: {customRender: 'htmlSlot'},
},
{
title: '会议类型',
@@ -243,14 +250,13 @@ export default {
footerDataSource: [],
//
queryParam: {
paymentYear: new Date().getFullYear().toString(),
year: new Date().getFullYear().toString(),
payMode: 3 // -
},
lastQueryParam: {
paymentYear: new Date().getFullYear().toString(),
year: new Date().getFullYear().toString(),
payMode: 3 // -
},
// todo
url: {
list: '/statistics/meetingPackStatistics/page',
exportXlsUrl: '/statistics/meetingPackStatistics/excelMeetingPackStatistics'
@@ -331,11 +337,11 @@ export default {
},
searchReset() {
this.lastQueryParam = {
paymentYear: new Date().getFullYear().toString(),
year: new Date().getFullYear().toString(),
payMode: 3 // -
}
this.queryParam = {
paymentYear: new Date().getFullYear().toString(),
year: new Date().getFullYear().toString(),
payMode: 3 // -
}
this.loadData(1)
@@ -388,10 +394,32 @@ export default {
},
//
paymentYearChange() {
if(!this.queryParam.paymentYear) {
if(!this.queryParam.year) {
this.queryParam.paymentMonth = undefined
}
}
},
/*
* 参会情况
* */
toAttendance(record) {
let pathMap = new Map()
pathMap.set('1','/incomePayments/meetManage/AttendanceWorkGroupMeeting')
pathMap.set('2','/incomePayments/meetManage/AttendanceStandardsMeeting')
pathMap.set('3','/incomePayments/meetManage/AttendanceInternalMeeting')
pathMap.set('4','/incomePayments/meetManage/AttendanceOhterMeeting')
pathMap.set('5','/incomePayments/meetManage/AttendanceCommitteeMeeting')
pathMap.set('6','/incomePayments/meetManage/AttendanceCouncilMeeting')
pathMap.set('7','/incomePayments/meetManage/AttendanceDraftGroupMeeting')
pathMap.set(MeetingTypeEnums.overseas.value,'/incomePayments/meetManage/AttendanceOverseasMeeting')
this.$router.push({
path: pathMap.get(record.meetingType+''),
query: {
id: record.meetingId,
meetingName: record.meetingName,
meetingType: record.meetingType
}
})
},
}
}
</script>
@@ -441,4 +469,9 @@ export default {
border-left: none;
}
}
.primary-color {
color: #069f99;
cursor: pointer;
}
</style>
@@ -159,9 +159,9 @@ export default {
getAction(this.url.list, params).then((res) => {
if (res.success) {
let dataSource = res.result.list
// table
// table todo
let tableData = [
{indexName: '年度待确收金额', total: res.result.sumOfMoney},
{indexName: '预估收入金额', total: res.result.sumOfMoney},
{indexName: '确认收入金额', total: res.result.sumOfConfirmAmount},
{indexName: '开票金额', total: res.result.sumOfBillMoney},
{indexName: '到账金额', total: res.result.sumOfReallyMoney},
@@ -171,7 +171,7 @@ export default {
let keyItem = MonthData.find(ele => Number(ele.value) === (index + 1))
if(keyItem) {
let key = keyItem.key
tableData[0][key] = item.allMoney
tableData[0][key] = item.estimatedArrivalMoney // todo
tableData[1][key] = item.confirmAmount
tableData[2][key] = item.billMoney
tableData[3][key] = item.comeAllMoney
@@ -63,6 +63,14 @@
@change="checkMoney('end')"></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否打包" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="queryParam.pack"
placeholder="请选择是否打包"
dictCode="yn"
/>
</a-form-item>
</a-col>
<a-col :xl="4" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery">查询</a-button>
@@ -99,7 +99,7 @@
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="export" @click="handleExportXls('项目来款统计')"
<a-button type="primary" icon="export" @click="handleExportXls('科室统计')"
v-has="'projectPaymentStatistics:export'">导出
</a-button>
</div>
@@ -0,0 +1,432 @@
<!--企业来款分类统计-->
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域-start -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row>
<a-col :xl="10" :lg="8" :md="8" :sm="24">
<a-form-item label="来款企业" :labelCol="labelCol" :wrapperCol="wrapperCol" style="margin-bottom: -1px">
<company-select isMultiple :can-add="false" placeholder="请选择来款企业"
v-model="queryParam.chargeCompany"></company-select>
</a-form-item>
</a-col>
<a-col :xl="10" :lg="11" :md="12" :sm="24">
<a-form-item label="项目年份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-year-date class="query-group-cust" placeholder="请选择开始年份" v-model="queryParam.year_begin" :disabled-date="disabledStartDate"></j-year-date>
<span class="query-group-split-cust"></span>
<j-year-date class="query-group-cust" placeholder="请选择结束年份" v-model="queryParam.year_end" :disabled-date="disabledEndDate"></j-year-date>
</a-form-item>
</a-col>
<a-col :xl="4" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery"
v-has="'companyPaymentClassificationStatistics:search'">查询</a-button>
<a-button icon="reload" @click="searchReset" class="reset-button">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- /-end-->
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="export" @click="handleExportXls('企业来款分类统计')"
v-has="'companyPaymentClassificationStatistics:export'">导出
</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域 :pagination="ipagination" -->
<div>
<a-table
size="middle"
ref="table"
bordered
rowKey="chargeCompanyId"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:scroll="{x: 1000}"
@change="handleTableChange"
:class="dataSource.length === 0 ? 'show-scroll' : ''"
class="j-table-force-nowrap main-table">
<!-- 项目名称-->
<template slot="projectName" slot-scope="text, record">
<j-ellipsis :value="text" :length="18" class="primary-color"
@click="openDetailModal(record)"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<a-tooltip>
<template slot="title">{{ text }}</template>
<div class="table-text">{{ text }}</div>
</a-tooltip>
</template>
<template slot="allMoney" slot-scope="text">
<a-tooltip>
<template slot="title">{{ formatMoney(text) }}</template>
<div class="table-text">{{ formatMoney(text) }}</div>
</a-tooltip>
</template>
<!--<span slot="action" class="action-span-cell" slot-scope="text, record">-->
<!-- <a @click="goDetail(record)" v-has="'companyPaymentClassificationStatistics:detail'">详情</a>-->
<!--</span>-->
<template slot="footer" v-if="dataSource.length > 0">
<a-table
size="middle"
ref="footTable"
rowKey="id"
:columns="columnsFooter"
:dataSource="footerDataSource"
:showHeader="false"
:pagination="false"
:scroll="{x: 1000}"
class="j-table-force-nowrap footer-table">
<!-- 项目名称-->
<template slot="projectName" slot-scope="text, record">
<j-ellipsis :value="text" :length="18" class="primary-color"
@click="openDetailModal(record)"></j-ellipsis>
</template>
<template slot="text" slot-scope="text">
<j-ellipsis :value="text" :length="18"></j-ellipsis>
</template>
<template slot="allMoney" slot-scope="text">
<a-tooltip>
<template slot="title">{{ formatMoney(text) }}</template>
<div class="table-text">{{ formatMoney(text) }}</div>
</a-tooltip>
</template>
</a-table>
</template>
</a-table>
</div>
</a-card>
</div>
</template>
<script>
import IconImg from '@/assets/imgs/icon/icon_statistical_report.png'
import PageHeaderTitle from '../../../components/layouts/PageHeaderTitle'
import { JeroListMixin } from '../../../mixins/JeroListMixin'
import JYearDate from '../../../components/jero/JYearDate'
import { getAction } from '@api/manage'
import CompanySelect from '@comp/company/CompanySelect'
import { filterObj } from '../../../utils/util'
import {formatMoney} from '@/utils/formatMoney'
import { MonthData } from '../statisticData'
import { RangeDateMixin } from '../../../mixins/RangeDateMixin'
const defaultTableColumns = [
{
title: '来款企业',
align: 'center',
width: 160,
dataIndex: 'name',
scopedSlots: { customRender: 'text' }
},
// {
// title: '',
// align: 'center',
// width: 160,
// sorter: true,
// dataIndex: 'allMoney',
// scopedSlots: { customRender: 'allMoney' }
// },
// {
// title: '',
// dataIndex: 'action',
// align: 'center',
// fixed: 'right',
// width: 160,
// scopedSlots: { customRender: 'action' }
// }
]
const firstColumnTop = {
title: '序号',
dataIndex: '',
key: 'rowIndex',
width: 60,
align: 'center',
customRender: function (t, r, index) {
return parseInt(index) + 1
}
}
const firstColumnFooter = {
title: '序号',
dataIndex: 'title',
align: 'center',
width: 60
}
// //
// const projectCategory = [
// { name: '', key: 'workGroup' },
// { name: '', key: 'generalProject' },
// { name: '', key: 'meeting' },
// { name: '', key: 'member' }
// ]
export default {
name: 'EnterprisePaymentStatisticsList',
components: { PageHeaderTitle, JYearDate, CompanySelect },
mixins: [JeroListMixin, RangeDateMixin],
data() {
return {
MonthData,
IconImg,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 10 }
},
url: {
list: '/statistics/companyComeMoney/classification',
exportXlsUrl: '/statistics/companyComeMoney/classificationExcel'
},
columns: [firstColumnTop, ...defaultTableColumns],
//
columnsFooter: [firstColumnFooter, ...defaultTableColumns],
//
footerDataSource: [],
//
queryParam: {
year_begin: new Date().getFullYear().toString(),
year_end: new Date().getFullYear().toString()
},
lastQueryParam: {
year_begin: new Date().getFullYear().toString(),
year_end: new Date().getFullYear().toString()
},
//
dateKeyObj: {
beginKey: 'year_begin',
endKey: 'year_end'
},
rangeDateFormat: {
begin: 'YYYY',
end: 'YYYY'
},
// disableMixinCreated: true // created
}
},
mounted() {
this.setScroll()
},
methods: {
formatMoney,
// footer
setScroll() {
if (this.dataSource.length === 0) {
return
}
let dom = this.$refs.footTable.$el.querySelectorAll('.ant-table-body')[0]
console.log(this.$refs.footTable.$el.querySelectorAll('.ant-table-body'))
dom.addEventListener(
'scroll',
() => {
this.$refs.table.$el.querySelectorAll(
'.ant-table-body'
)[0].scrollLeft = dom.scrollLeft
},
true
)
},
getQueryParams() {
//
let sqp = {}
if (this.superQueryParams) {
sqp['superQueryParams'] = encodeURI(this.superQueryParams)
sqp['superQueryMatchType'] = this.superQueryMatchType
}
// var param = Object.assign(sqp, this.queryParam, this.isorter ,this.filters);
let param = Object.assign(sqp, this.lastQueryParam, this.isorter, this.filters)
param.field = this.getQueryField()
param.pageNo = this.ipagination.current
param.pageSize = this.ipagination.pageSize
// id
if (param.chargeCompany && param.chargeCompany.hasOwnProperty.call(param.chargeCompany, 'id')) {
param.chargeCompanyId = param.chargeCompany.id
//
delete param.chargeCompany
}
return filterObj(param)
},
/*
* 获取查询的列数
* titleList: item数组
* item 信息
* item."name": "企业名称",
* item."key": "name"
* */
getColumnsData(titleList) {
let columnsObj = []
titleList.map(title => {
let item = {
title: title.name,
align: 'center',
width: 160,
// sorter: true,
dataIndex: title.key,
scopedSlots: { customRender: 'allMoney' }
}
columnsObj.push(item)
})
return columnsObj
},
loadData(arg) {
if (!this.url.list) {
this.$message.error('请设置url.list属性!')
return
}
// 1
if (arg === 1) {
this.ipagination.current = 1
}
let params = this.getQueryParams()//
this.loading = true
getAction(this.url.list, params).then((res) => {
if (res.success) {
// TableColumns
// let columnsKeys = res.result.columns || []
let syncColumns = this.getColumnsData(res.result.titleList || [])
this.columns = [firstColumnTop, ...defaultTableColumns, ...syncColumns]
this.columnsFooter = [firstColumnFooter, ...defaultTableColumns, ...syncColumns]
// this.dataSource = res.result.pageList.records
//
this.dataSource = res.result.valList || []
this.dataSource.map(data => {
syncColumns.map(col => {
data[col.dataIndex] = data[col.dataIndex] || '0.00' + ''
})
})
//
let footerData = res.result.allMap || {}
let obj = {
id: '1',
title: '总计'
// allMoney: res.result.sumOfMoney || '0.00' + '',
// comeAllMoney: res.result.sumOfReallyMoney || '0.00' + '',
// billMoney: res.result.sumOfBillMoney || '0.00' + '',
// confirmAmount: res.result.sumOfConfirmAmount || '0.00' + ''
}
syncColumns.map(col => {
obj[col.dataIndex] = footerData[col.dataIndex] || '0.00' + ''
})
this.footerDataSource = [obj]
if (res.result.page.total) {
this.ipagination.total = res.result.page.total
} else {
this.ipagination.total = 0
}
}
if (this.dataSource.length > 0) {
this.$nextTick(() => {
this.setScroll()
})
}
if (res.code === 510) {
this.$message.warning(res.message)
}
this.loading = false
}).finally(() => {
this.loading = false
})
},
searchQuery() {
if(!this.queryParam.year_begin || !this.queryParam.year_end) {
this.$message.warning('请选择项目年份时间段')
return
}
// if(!this.queryParam.chargeCompany) {
// this.$message.warning('')
// return
// }
this.lastQueryParam = {...this.queryParam}
this.loadData(1)
},
searchReset() {
this.lastQueryParam = {
year_begin: new Date().getFullYear().toString(),
year_end: new Date().getFullYear().toString()
}
this.queryParam = {
year_begin: new Date().getFullYear().toString(),
year_end: new Date().getFullYear().toString()
}
this.loadData(1)
}
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
//
.main-table {
/deep/ .ant-table-thead th div{
white-space: pre-wrap;
}
/deep/ .ant-table-body {
overflow-x: hidden !important;
}
/deep/ .ant-table-footer {
padding: 0 0;
}
/deep/ .ant-table.ant-table-bordered .ant-table-footer {
border-left: none;
margin-top: -2px;
}
}
.show-scroll {
/deep/ .ant-table-body {
overflow-x: auto !important;
}
}
//
.footer-table {
/deep/ .ant-table-tbody > tr > td {
border: none;
background-color: #F5F5F5;
}
/deep/ .ant-table-fixed-right table {
border-left: none !important;
background: none;
}
/deep/ .ant-table-body {
overflow-x: auto !important;
}
/deep/ .ant-table-bordered .ant-table-header > table {
border-left: none;
}
}
</style>
@@ -63,6 +63,14 @@
@change="checkMoney('end')"></a-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<a-form-item label="是否打包" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-dict-select-tag v-model="queryParam.pack"
placeholder="请选择是否打包"
dictCode="yn"
/>
</a-form-item>
</a-col>
<a-col :xl="4" :lg="7" :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" icon="search" @click="searchQuery">查询</a-button>
+114
View File
@@ -0,0 +1,114 @@
<!--年度数据锁定-->
<template>
<div>
<page-header-title :img-for-icon="IconImg"></page-header-title>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="24">
<a-col :xl="8" :lg="8" :md="8" :sm="24">
<a-form-item label="年份">
<j-year-date style="width:100%" placeholder="请选择年份"
v-model="queryParam.year"></j-year-date>
</a-form-item>
</a-col>
<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" v-has="'annualDataLockingList:search'">查询</a-button>
<a-button class="reset-button" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 操作按钮区域-->
<div class="table-operator">
<a-button type="primary" icon="plus" @click="handleAdd" v-has="'annualDataLockingList:add'">新增</a-button>
<a-button type="danger" icon="delete" @click="batchDel" v-has="'annualDataLockingList:batchDel'">批量删除</a-button>
</div>
<!-- 操作按钮区域-end-->
<!-- table表格区域-->
<div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:scroll="{x: 600}"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
@change="handleTableChange"
class="j-table-force-nowrap">
<span slot="action" class="action-span-cell" slot-scope="text, record">
<!--<a @click="handleEdit(record)" v-has="'annualDataLockingList:edit'">编辑</a>-->
<a @click="handleDelete(record.id)" v-has="'annualDataLockingList:delete'">删除</a>
</span>
</a-table>
</div>
<annual-data-locking-modal ref="modalForm" @ok="modalFormOk"></annual-data-locking-modal>
</a-card>
</div>
</template>
<script>
import { JeroListMixin } from '@/mixins/JeroListMixin'
import PageHeaderTitle from '@comp/layouts/PageHeaderTitle'
import JYearDate from '@comp/jero/JYearDate'
import IconImg from '@/assets/imgs/icon/icon_system.png'
import AnnualDataLockingModal from './modules/AnnualDataLockingModal'
export default {
name: 'AnnualDataLockingList',
mixins: [JeroListMixin],
components: {
PageHeaderTitle,
JYearDate,
AnnualDataLockingModal
},
data() {
return {
IconImg,
columns: [
{
title: '年份',
align: 'center',
dataIndex: 'year',
// width: 280,
scopedSlots: { customRender: 'text' }
},
{
title: '操作',
dataIndex: 'action',
// width: 240,
// fixed: 'right',
scopedSlots: { customRender: 'action' },
align: 'center'
}
],
postMethodDel: true,
url: {
list: '/sys/annualDataLocking/page',
delete: '/sys/annualDataLocking/delete',
deleteBatch: '/sys/annualDataLocking/deleteBatch'
}
}
},
methods: {
}
}
</script>
<style scoped lang="less">
@import '~@assets/less/common.less';
</style>
@@ -0,0 +1,118 @@
<!--年度数据锁定-新增编辑-->
<template>
<j-modal
:title="title"
:width="width"
:visible="visible"
:confirmLoading="confirmLoading"
switchFullscreen
@ok="handleOk"
@cancel="handleCancel"
okText="保存"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item label="年份" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-year-date
style="width:100%"
placeholder="请选择年份"
v-decorator="['year',validatorRules.year]">
</j-year-date>
</a-form-item>
</a-form>
</a-spin>
</j-modal>
</template>
<script>
import pick from 'lodash.pick'
import JYearDate from '../../../components/jero/JYearDate'
import { postAction } from '../../../api/manage'
export default {
name: 'AnnualDataLockingModal',
components: {JYearDate },
data() {
return {
title: '操作',
width: 900,
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 14 }
},
url: {
add: '/sys/annualDataLocking/add',
edit: '/sys/annualDataLocking/edit'
},
validatorRules: {
year: {
rules: [{ required: true, message: '请选择年份' }],
validateTrigger: 'change'
},
}
}
},
methods: {
add() {
this.edit({})
},
edit(record) {
this.visible = true
this.form.resetFields()
this.model = Object.assign({}, record)
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.model, 'year'))
})
},
handleOk() {
if (this.confirmLoading) {
return
}
this.form.validateFields((err, values) => {
if (!err) {
this.confirmLoading = true
let httpUrl = ''
if (!this.model.id) {
httpUrl += this.url.add
} else {
httpUrl += this.url.edit
}
const formData = Object.assign({}, this.model, values)
postAction(httpUrl, formData).then(res => {
if (res.success) {
this.$message.success(res.message)
this.$emit('ok')
this.handleCancel()
} else {
this.$message.warn(res.message)
}
}).finally(() => {
setTimeout(() => {
this.confirmLoading = false
}, 1000)
})
}
})
},
handleCancel() {
this.close()
},
close() {
this.visible = false
},
}
}
</script>
<style scoped>
</style>
+10 -4
View File
@@ -392,7 +392,7 @@ export default {
//
this.loadRolesTreeData()
//
this.getPublicKey()
// this.getPublicKey()
let that = this
that.initialRoleList()
that.checkedDepartNameString = ''
@@ -479,9 +479,14 @@ export default {
},
getPublicKey() {
//
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
loadCheckedDeparts() {
let that = this
@@ -538,7 +543,7 @@ export default {
console.log('username', this.form.getFieldValue('username'))
const that = this
//
this.form.validateFields((err, values) => {
this.form.validateFields(async (err, values) => {
if (!err) {
that.confirmLoading = true
console.log('values=======', values)
@@ -548,6 +553,7 @@ export default {
} else {
formData.avatar = null
}
await this.getPublicKey()
//
formData.rsaPublicKey = that.rsaPublicKey
// JSEncrypt
+8 -4
View File
@@ -150,8 +150,9 @@ export default {
let that = this
let loginParams = {}
that.loginBtn = true
that.form.validateFields([ 'username', 'password','inputCode', 'rememberMe' ], { force: true }, (err, values) => {
that.form.validateFields([ 'username', 'password','inputCode', 'rememberMe' ], { force: true }, async (err, values) => {
if (!err) {
await this.getPublicKey()
loginParams.remember_me = values.rememberMe
loginParams.captcha = that.inputCodeContent
loginParams.checkKey = that.currdatetime
@@ -243,13 +244,16 @@ export default {
}).catch(()=>{
this.requestCodeSuccess=false
})
this.getPublicKey()
},
//RSA
getPublicKey(){
//
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
loginSuccess () {
+8 -4
View File
@@ -180,9 +180,10 @@ export default {
submit() {
let that = this
that.loading = true
this.form.validateFields((err, values) => {
this.form.validateFields(async (err, values) => {
if (!err) {
let params = {}
await this.getPublicKey()
console.log(values, '======values')
params.rsaPublicKey = this.rsaPublicKey
let encrypt = new JSEncrypt()
@@ -271,7 +272,6 @@ export default {
}
setTimeout(hide, 500)
})
this.getPublicKey()
}
})
},
@@ -283,8 +283,12 @@ export default {
})
},
getPublicKey() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
return new Promise(resolve => {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
}).finally(() => {
resolve(this.rsaPublicKey)
})
})
},
//
+3 -2
View File
@@ -79,7 +79,7 @@ module.exports = {
},
devServer: {
port: 3000,
port: 21825,
proxy: {
/* '/api': {
target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', //mock API接口系统
@@ -91,7 +91,8 @@ module.exports = {
},*/
'/jero-boot': {
// ''
target: 'http://localhost:8080', //请求本地 jero-boot后台项目
// target: 'http://10.0.10.78:21824', //请求本地 jero-boot后台项目
target: "http://localhost:21824", //
ws: false,
changeOrigin: true
},