diff --git a/README.md b/README.md index 745a2bc..218a397 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 公司先后获得河南省高新技术企业、国家3A信用企业、IOS9001软件产品认证等20多项荣誉奖项。拥有50余项软件著作权。 获得20余家国内媒体报道。公司自成立以来,以高科技为起点,以技术为核心、 以完善的售后服务为后盾,秉承稳固与发展、求实与创新的精神,已为国内外上万家企业提供了服务。 在为实现企业价值最大化的过程中, 实现了自身的价值的提升,取得了最大程度的双赢合作,并获得了社会各界的广泛赞誉和认同。 -官网地址:[http://www.5kcrm.com](http://www.5kcrm.com/) +官网地址:[http://www.5kcrm.com](http://www.5kcrm.com/) 演示地址:(http://demo11.5kcrm.net/) 帐号:18688888888 密码:123456a diff --git a/package.json b/package.json index 220f2d1..83f9f00 100644 --- a/package.json +++ b/package.json @@ -24,20 +24,21 @@ "axios": "0.18.0", "babel-polyfill": "^6.26.0", "clipboard": "^2.0.4", - "echarts": "4.3.0", + "echarts": "^4.3.0", "el-bigdata-table": "^1.0.32", "element-ui": "^2.12.0", "file-saver": "^2.0.1", "id-validator": "^1.3.0", - "js-cookie": "2.2.0", - "js-md5": "^0.7.3", + "js-cookie": "2.2.1", "lockr": "^0.8.5", "normalize.css": "7.0.0", "nprogress": "0.2.0", + "number-precision": "^1.5.0", "numeral": "^2.0.6", "nzh": "^1.0.4", "pinyin-match": "1.0.9", "qrcodejs2": "0.0.2", + "signature_pad": "3.0.0-beta.4", "throttle-debounce": "^2.1.0", "vue": "2.5.17", "vue-bus": "^1.1.0", @@ -48,7 +49,8 @@ "vue-radial-progress": "^0.2.10", "vue-router": "3.0.1", "vue2-animate": "^2.1.2", - "vuedraggable": "^2.16.0", + "vue2-org-tree": "1.3.1", + "vuedraggable": "2.24.3", "vuex": "3.0.1", "xlsx": "^0.14.1", "xss": "^1.0.6" @@ -75,6 +77,8 @@ "file-loader": "1.1.11", "friendly-errors-webpack-plugin": "1.7.0", "html-webpack-plugin": "4.0.0-alpha", + "less": "3.0.0", + "less-loader": "4.1.0", "mini-css-extract-plugin": "0.4.1", "node-notifier": "5.2.1", "node-sass": "^4.7.2", diff --git a/src/api/admin/crm.js b/src/api/admin/crm.js index 50c8718..672971a 100644 --- a/src/api/admin/crm.js +++ b/src/api/admin/crm.js @@ -78,7 +78,10 @@ export function customFieldHandleAPI(data) { return request({ url: 'admin/field/update', method: 'post', - data: data + data: data, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } }) } diff --git a/src/api/admin/employeeDep.js b/src/api/admin/employeeDep.js index ca9555a..2fa727f 100644 --- a/src/api/admin/employeeDep.js +++ b/src/api/admin/employeeDep.js @@ -52,10 +52,19 @@ export function userAddAPI(params) { }) } +// // 角色列表 +// export function roleListAPI(data) { +// return request({ +// url: 'admin/groups/index', +// method: 'post', +// data: data +// }) +// } + // 角色列表 export function roleListAPI(data) { return request({ - url: 'admin/groups/index', + url: 'admin/rules/getgroupauth', method: 'post', data: data }) @@ -195,3 +204,41 @@ export function adminUserSetUserDeptPI(data) { } }) } + +/** + * 查询配置的角色范围 + * @param {*} data + * @returns + */ +export function adminRoleQueryAuthRoleAPI(data) { + return request({ + url: `admin/rules/groupauthId`, + method: 'post', + data + }) +} + +/** + * 更新配置的角色范围 + * @param {*} data + * @returns + */ +export function adminRoleUpdateAuthRoleAPI(data) { + return request({ + url: `admin/rules/upgroupauth`, + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) +} + +// 部分角色列表 +export function adminRoleGetRoleListAPI(data) { + return request({ + url: 'admin/rules/groupauth', + method: 'post', + data: data + }) +} diff --git a/src/api/common.js b/src/api/common.js index 73b980f..8b319be 100644 --- a/src/api/common.js +++ b/src/api/common.js @@ -361,3 +361,25 @@ export function readUpdateNoticeAPI(data) { data: data }) } + +/** + * 公共web文件上传 + * @param data + */ +export function crmFileSingleSaveAPI(data) { + var param = new FormData() + Object.keys(data).forEach(key => { + param.append(key, data[key]) + // param.append('isPublic', '1') + // param.append('module', 'print') + param.append('type', 'img') + }) + return request({ + url: 'admin/file/save', + method: 'post', + data: param, + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} diff --git a/src/api/crm/customer.js b/src/api/crm/customer.js index 3e894eb..5a147f0 100644 --- a/src/api/crm/customer.js +++ b/src/api/crm/customer.js @@ -9,7 +9,10 @@ export function crmCustomerSaveAPI(data) { return request({ url: 'crm/customer/' + url, method: 'post', - data: data + data: data, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } }) } diff --git a/src/api/crm/invoice.js b/src/api/crm/invoice.js index f9a5a1d..f88242b 100644 --- a/src/api/crm/invoice.js +++ b/src/api/crm/invoice.js @@ -188,3 +188,16 @@ export function crmInvoiceDeleteInvoiceInfoAPI(data) { data: data }) } + +/** + * 发票全部导出 + * @param {*} data + */ +export function crmInvoiceExcelAllExportAPI(data) { + return request({ + url: 'crm/invoice/excelExport', + method: 'post', + data: data, + responseType: 'blob' + }) +} diff --git a/src/api/crm/workbench.js b/src/api/crm/workbench.js index 29f0815..d91a560 100644 --- a/src/api/crm/workbench.js +++ b/src/api/crm/workbench.js @@ -108,7 +108,7 @@ export function crmIndexFunnelAPI(data) { */ export function crmInstrumentSellFunnelBusinessListAPI(data) { return request({ - url: 'crmInstrument/sellFunnelBusinessList', + url: 'crm/index/businessList', method: 'post', data: data, headers: { @@ -251,44 +251,55 @@ export function crmIndexUnContactCustomerAPI(data) { //* ********************************** /** - * + * 跟进记录导出 * @param {*} data */ export function crmInstrumentExportRecordListAPI(data) { + var param = new FormData() + Object.keys(data).forEach(key => { + param.append(key, data[key]) + }) return request({ - url: '', + url: 'crm/activity/excelExport', method: 'post', - data: data, + data: param, + responseType: 'blob', headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } + 'Content-Type': 'multipart/form-data' + }, + timeout: 60000 }) } /** - * + * 跟进记录导入 * @param {*} data */ export function crmInstrumentImportRecordListAPI(data) { + var param = new FormData() + Object.keys(data).forEach(key => { + param.append(key, data[key]) + }) return request({ - url: '', + url: 'crm/activity/excelImport', method: 'post', - data: data, + data: param, headers: { - 'Content-Type': 'application/json;charset=UTF-8' + 'Content-Type': 'multipart/form-data' } }) } /** - * + * 日志导入模板下载 * @param {*} data */ export function crmInstrumentDownloadRecordExcelAPI(data) { return request({ - url: '', + url: 'crm/activity/excelDownload', method: 'post', data: data, + responseType: 'blob', headers: { 'Content-Type': 'application/json;charset=UTF-8' } diff --git a/src/api/oa/journal.js b/src/api/oa/journal.js index b403f86..2c35067 100644 --- a/src/api/oa/journal.js +++ b/src/api/oa/journal.js @@ -200,3 +200,18 @@ export function journalQueryActivityCountAPI(data) { } }) } + +/** + * 日志点赞 + * @param {*} data + */ +export function oaLogFavourOrCancelAPI(data) { + return request({ + url: 'oa/log/favourUpdate', + method: 'post', + data: data, + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + } + }) +} diff --git a/src/api/pm/project.js b/src/api/pm/project.js index 1dbf1a1..13f8b36 100644 --- a/src/api/pm/project.js +++ b/src/api/pm/project.js @@ -383,3 +383,19 @@ export function workWorkAddUserSetRoleGroupAPI(data) { data: data }) } + +// /** +// * 项目成员权限列表 +// * @param {*} data +// */ +// export function (data) { +// return request({ +// url: 'work/work/addUserGroup', +// method: 'post', +// headers: { +// 'Content-Type': 'application/json;charset=UTF-8' +// }, +// data: data +// }) +// } + diff --git a/src/assets/iconfont copy1/iconfont.css b/src/assets/iconfont copy1/iconfont.css new file mode 100644 index 0000000..bceb09e --- /dev/null +++ b/src/assets/iconfont copy1/iconfont.css @@ -0,0 +1,345 @@ +@font-face {font-family: "wukong"; + src: url('iconfont.eot?t=1586312422376'); /* IE9 */ + src: url('iconfont.eot?t=1586312422376#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), + url('iconfont.woff?t=1586312422376') format('woff'), + url('iconfont.ttf?t=1586312422376') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('iconfont.svg?t=1586312422376#wukong') format('svg'); /* iOS 4.1- */ +} + +.wukong { + font-family: "wukong" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.wukong-chenggong:before { + content: "\e873"; +} + +.wukong-oa_analysis:before { + content: "\e705"; +} + +.wukong-icon_reset_account_login:before { + content: "\e703"; +} + +.wukong-marketing:before { + content: "\e704"; +} + +.wukong-examine-category-nine:before { + content: "\e6c2"; +} + +.wukong-examine-category-eight:before { + content: "\e6db"; +} + +.wukong-examine-category-overtime:before { + content: "\e6e4"; +} + +.wukong-examine-category-seven:before { + content: "\e6e5"; +} + +.wukong-examine-category-ordinary:before { + content: "\e6f3"; +} + +.wukong-examine-category-leave:before { + content: "\e702"; +} + +.wukong-examine-category-six:before { + content: "\e70a"; +} + +.wukong-examine-category-five:before { + content: "\e70f"; +} + +.wukong-examine-category-four:before { + content: "\e71f"; +} + +.wukong-examine-category-business:before { + content: "\e739"; +} + +.wukong-examine-category-borrowing:before { + content: "\e73b"; +} + +.wukong-examine-category-billing:before { + content: "\e744"; +} + +.wukong-examine-category-two:before { + content: "\e75f"; +} + +.wukong-examine-category-three:before { + content: "\e767"; +} + +.wukong-examine-category-one:before { + content: "\e627"; +} + +.wukong-log-delete:before { + content: "\e6ff"; +} + +.wukong-log-reply:before { + content: "\e701"; +} + +.wukong-check:before { + content: "\e698"; +} + +.wukong-help_tips:before { + content: "\e700"; +} + +.wukong-BI_Leaderboard:before { + content: "\e6fc"; +} + +.wukong-BI_Office:before { + content: "\e6fd"; +} + +.wukong-BI_Employee_performance:before { + content: "\e6fe"; +} + +.wukong-dashboard:before { + content: "\e697"; +} + +.wukong-business-customer:before { + content: "\e699"; +} + +.wukong-versions:before { + content: "\e696"; +} + +.wukong-goout:before { + content: "\e695"; +} + +.wukong-personcenter:before { + content: "\e694"; +} + +.wukong-reminder:before { + content: "\e653"; +} + +.wukong-systemconfig:before { + content: "\e679"; +} + +.wukong-taskSetstatistics:before { + content: "\e67a"; +} + +.wukong-task:before { + content: "\e67b"; +} + +.wukong-taskCompletestatistics:before { + content: "\e67c"; +} + +.wukong-examine:before { + content: "\e67d"; +} + +.wukong-funnelstatistics:before { + content: "\e67e"; +} + +.wukong-workbench:before { + content: "\e67f"; +} + +.wukong-project:before { + content: "\e680"; +} + +.wukong-message:before { + content: "\e681"; +} + +.wukong-notice:before { + content: "\e682"; +} + +.wukong-money:before { + content: "\e683"; +} + +.wukong-employeestatistics:before { + content: "\e684"; +} + +.wukong-moneystatistics:before { + content: "\e685"; +} + +.wukong-product:before { + content: "\e686"; +} + +.wukong-example:before { + content: "\e687"; +} + +.wukong-tag:before { + content: "\e688"; +} + +.wukong-log:before { + content: "\e689"; +} + +.wukong-over:before { + content: "\e68a"; +} + +.wukong-leads:before { + content: "\e68b"; +} + +.wukong-pay:before { + content: "\e68c"; +} + +.wukong-schedule:before { + content: "\e68d"; +} + +.wukong-statistics:before { + content: "\e68e"; +} + +.wukong-seas:before { + content: "\e68f"; +} + +.wukong-subproject:before { + content: "\e690"; +} + +.wukong-productstatistics:before { + content: "\e691"; +} + +.wukong-set:before { + content: "\e692"; +} + +.wukong-recycle:before { + content: "\e693"; +} + +.wukong-contract:before { + content: "\e675"; +} + +.wukong-customer:before { + content: "\e676"; +} + +.wukong-contacts:before { + content: "\e677"; +} + +.wukong-department:before { + content: "\e678"; +} + +.wukong-certificate:before { + content: "\e674"; +} + +.wukong-business:before { + content: "\e673"; +} + +.wukong-book:before { + content: "\e672"; +} + +.wukong-address:before { + content: "\e671"; +} + +.wukong-lock:before { + content: "\e625"; +} + +.wukong-edit-task:before { + content: "\e670"; +} + +.wukong-delete-task:before { + content: "\e66f"; +} + +.wukong-addition-task:before { + content: "\e66e"; +} + +.wukong-person-task:before { + content: "\e66c"; +} + +.wukong-time-task:before { + content: "\e66b"; +} + +.wukong-comment-task:before { + content: "\e668"; +} + +.wukong-activity-task:before { + content: "\e667"; +} + +.wukong-black-label:before { + content: "\e665"; +} + +.wukong-relevance:before { + content: "\e664"; +} + +.wukong-user:before { + content: "\e663"; +} + +.wukong-file:before { + content: "\e662"; +} + +.wukong-sub-task:before { + content: "\e660"; +} + +.wukong-label:before { + content: "\e65f"; +} + +.wukong-lightning:before { + content: "\e65e"; +} + diff --git a/src/assets/iconfont copy1/iconfont.eot b/src/assets/iconfont copy1/iconfont.eot new file mode 100644 index 0000000..8d553f3 Binary files /dev/null and b/src/assets/iconfont copy1/iconfont.eot differ diff --git a/src/assets/iconfont copy1/iconfont.svg b/src/assets/iconfont copy1/iconfont.svg new file mode 100644 index 0000000..f96db28 --- /dev/null +++ b/src/assets/iconfont copy1/iconfont.svg @@ -0,0 +1,704 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/iconfont copy1/iconfont.ttf b/src/assets/iconfont copy1/iconfont.ttf new file mode 100644 index 0000000..030cc4a Binary files /dev/null and b/src/assets/iconfont copy1/iconfont.ttf differ diff --git a/src/assets/iconfont copy1/iconfont.woff b/src/assets/iconfont copy1/iconfont.woff new file mode 100644 index 0000000..3051fe8 Binary files /dev/null and b/src/assets/iconfont copy1/iconfont.woff differ diff --git a/src/assets/iconfont copy1/iconfont.woff2 b/src/assets/iconfont copy1/iconfont.woff2 new file mode 100644 index 0000000..9db08b3 Binary files /dev/null and b/src/assets/iconfont copy1/iconfont.woff2 differ diff --git a/src/assets/img/crm/receivables_plan.png b/src/assets/img/crm/receivables_plan.png new file mode 100644 index 0000000..5356e2c Binary files /dev/null and b/src/assets/img/crm/receivables_plan.png differ diff --git a/src/components/CRMImport/index.vue b/src/components/CRMImport/index.vue index f379dc0..411c0c8 100644 --- a/src/components/CRMImport/index.vue +++ b/src/components/CRMImport/index.vue @@ -114,6 +114,7 @@ slot="footer" class="dialog-footer"> 0 ? this.user[0].id : '' + if (this.config.ownerSelectShow) { + params.owner_user_id = this.user.length > 0 ? this.user[0].id : '' + } if (this.config.poolSelectShow) { params.pool_id = this.pool_id } @@ -434,6 +439,12 @@ export default { product: crmProductExcelImportAPI }[this.crmType] this.loading = true + if (this.config.importParams) { + params = { + ...params, + ...this.config.importParams + } + } request(params) .then(res => { if (result) { @@ -524,7 +535,7 @@ export default { contacts: crmContactsDownloadExcelAPI, product: crmProductDownloadExcelAPI }[this.crmType] - request({ pool_id: this.config.poolSelectShow && this.pool_id }) + request(this.config.templateParams || { pool_id: this.config.poolSelectShow && this.pool_id }) .then(res => { downloadExcelWithResData(res) }) diff --git a/src/components/CreateCom/CrmRelativeTable.vue b/src/components/CreateCom/CrmRelativeTable.vue index e29381a..62ef349 100644 --- a/src/components/CreateCom/CrmRelativeTable.vue +++ b/src/components/CreateCom/CrmRelativeTable.vue @@ -376,7 +376,6 @@ export default { params[this.action.data.moduleType + '_id'] = this.action.data[ this.action.data.moduleType + 'Id'] || this.action.data[ this.action.data.moduleType + '_id'] - if (this.action.data.params) { for (const field in this.action.data.params) { params[field] = this.action.data.params[field] diff --git a/src/components/NewCom/WkCheckbox/index.vue b/src/components/NewCom/WkCheckbox/index.vue new file mode 100644 index 0000000..8e393ff --- /dev/null +++ b/src/components/NewCom/WkCheckbox/index.vue @@ -0,0 +1,212 @@ + + + + + diff --git a/src/components/NewCom/WkDescText/index.vue b/src/components/NewCom/WkDescText/index.vue new file mode 100644 index 0000000..de05006 --- /dev/null +++ b/src/components/NewCom/WkDescText/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/NewCom/WkDetailTable/View.vue b/src/components/NewCom/WkDetailTable/View.vue new file mode 100644 index 0000000..d6615a6 --- /dev/null +++ b/src/components/NewCom/WkDetailTable/View.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/components/NewCom/WkDetailTable/WkTableItems.vue b/src/components/NewCom/WkDetailTable/WkTableItems.vue new file mode 100644 index 0000000..0aa6ea9 --- /dev/null +++ b/src/components/NewCom/WkDetailTable/WkTableItems.vue @@ -0,0 +1,160 @@ + + + + + + + diff --git a/src/components/NewCom/WkDetailTable/index.vue b/src/components/NewCom/WkDetailTable/index.vue new file mode 100644 index 0000000..259ecba --- /dev/null +++ b/src/components/NewCom/WkDetailTable/index.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/components/NewCom/WkDistpicker/index.vue b/src/components/NewCom/WkDistpicker/index.vue new file mode 100644 index 0000000..60f14c1 --- /dev/null +++ b/src/components/NewCom/WkDistpicker/index.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/src/components/NewCom/WkForm/Mixin.js b/src/components/NewCom/WkForm/Mixin.js index 233ee9b..f207ed6 100644 --- a/src/components/NewCom/WkForm/Mixin.js +++ b/src/components/NewCom/WkForm/Mixin.js @@ -2,13 +2,14 @@ export default { methods: { /** * 判断是否为普通 整句 文本框 - * @param formType 字段类型 + * @param form_type 字段类型 */ - isTrimInput(formType) { + isTrimInput(form_type) { return [ 'mobile', - 'email' - ].includes(formType) + 'email', + 'website' + ].includes(form_type) }, /** * 部门事件 @@ -37,7 +38,10 @@ export default { oldChange(dataValue, field, index) { this.$set(this.fieldFrom, field.field, dataValue.value) this.$emit('change', field, index, dataValue.value) - this.$refs.form.validateField(field.field) + // this.$refs.form.validateField(field.field) + if (this.$refs.form) { + this.$refs.form.validateField(field.field) + } }, /** @@ -68,6 +72,36 @@ export default { getTips(data) { const tips = data.tips || data.inputTips return tips ? `(${tips})` : '' + }, + /** + * 判断展示 + */ + getShowValue(item) { + if (item.hasOwnProperty('show')) { + return item.show + } + return true + }, + /** + * 获取类型图标 + * @param {*} formType + */ + getInputIcon(formType) { + return { + mobile: 'wk wk-icon-mobile', + email: 'wk wk-icon-email-outline', + website: 'wk wk-icon-link' + }[formType] + }, + /** + * 获取输入最大长度 + * @param {*} formType + */ + getInputMaxlength(formType) { + if (formType === 'website') { + return 800 + } + return 100 } } } diff --git a/src/components/NewCom/WkForm/WkField.vue b/src/components/NewCom/WkForm/WkField.vue new file mode 100644 index 0000000..8691d79 --- /dev/null +++ b/src/components/NewCom/WkForm/WkField.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/src/components/NewCom/WkForm/WkFieldView.vue b/src/components/NewCom/WkForm/WkFieldView.vue new file mode 100644 index 0000000..ead3a94 --- /dev/null +++ b/src/components/NewCom/WkForm/WkFieldView.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/components/NewCom/WkForm/WkFormItem.vue b/src/components/NewCom/WkForm/WkFormItem.vue new file mode 100644 index 0000000..070d9ff --- /dev/null +++ b/src/components/NewCom/WkForm/WkFormItem.vue @@ -0,0 +1,130 @@ + + + + + + + + diff --git a/src/components/NewCom/WkForm/WkFormItems.vue b/src/components/NewCom/WkForm/WkFormItems.vue index 3e3e32e..a56f492 100644 --- a/src/components/NewCom/WkForm/WkFormItems.vue +++ b/src/components/NewCom/WkForm/WkFormItems.vue @@ -1,188 +1,45 @@ diff --git a/src/components/NewCom/WkForm/index.vue b/src/components/NewCom/WkForm/index.vue index b77abc0..de110ad 100644 --- a/src/components/NewCom/WkForm/index.vue +++ b/src/components/NewCom/WkForm/index.vue @@ -16,7 +16,7 @@ v-for="(item, index) in fieldList" :key="index" :prop="item.field" - :class="[item.className || '', `is-${item.formType}`]"> + :class="[item.className || '', `is-${item.form_type}`]"> item.name).join() : placeholder + } else if (form_type === 'floatnumber') { + return isEmpty(value) ? '' : separator(value) + } else if (form_type === 'date') { + return getWkDateTime(value) + } else if (form_type === 'location') { + return isObject(value) ? value.address : placeholder + } else if (form_type === 'date_interval') { + return isArray(value) ? value.join('-') : placeholder + } else if (form_type === 'percent') { + return isEmpty(value) ? placeholder : `${value}%` + } else if (form_type === 'single_user') { + if (isObject(value)) { + return value.realname || placeholder + } + return value || placeholder + } else if (form_type === 'select') { + const newValue = CustomFieldsMixin.methods.getRealParams({ form_type }, value) + if (isEmpty(newValue)) { + return placeholder + } else { + return newValue + } + } else if (form_type === 'checkbox') { + const newValue = CustomFieldsMixin.methods.getRealParams({ form_type }, value) + if (isEmpty(newValue)) { + return placeholder + } else { + return newValue + } + } else if (form_type === 'structure') { + if (isArray(value)) { + return value.map(item => item.name).join() || placeholder + } + return value || placeholder + } else if (form_type === 'user') { + if (isArray(value)) { + return value.map(item => item.realname).join() || placeholder + } + return value || placeholder + } else if (form_type === 'check_status') { + return CheckStatusMixin.methods.getStatusName(value) + } + + return isEmpty(value) ? placeholder : value +} diff --git a/src/components/NewCom/WkLocation/index.vue b/src/components/NewCom/WkLocation/index.vue new file mode 100644 index 0000000..fe86eca --- /dev/null +++ b/src/components/NewCom/WkLocation/index.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/components/NewCom/WkLocationPointDialog/index.vue b/src/components/NewCom/WkLocationPointDialog/index.vue new file mode 100644 index 0000000..38ebff1 --- /dev/null +++ b/src/components/NewCom/WkLocationPointDialog/index.vue @@ -0,0 +1,210 @@ + + + diff --git a/src/components/NewCom/WkPercentInput/index.vue b/src/components/NewCom/WkPercentInput/index.vue new file mode 100644 index 0000000..03782ea --- /dev/null +++ b/src/components/NewCom/WkPercentInput/index.vue @@ -0,0 +1,281 @@ + + diff --git a/src/components/NewCom/WkPosition/index.vue b/src/components/NewCom/WkPosition/index.vue new file mode 100644 index 0000000..c473da6 --- /dev/null +++ b/src/components/NewCom/WkPosition/index.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/components/NewCom/WkSelect/index.vue b/src/components/NewCom/WkSelect/index.vue new file mode 100644 index 0000000..cfda989 --- /dev/null +++ b/src/components/NewCom/WkSelect/index.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/components/NewCom/WkSignaturePad/Image.vue b/src/components/NewCom/WkSignaturePad/Image.vue new file mode 100644 index 0000000..96c059b --- /dev/null +++ b/src/components/NewCom/WkSignaturePad/Image.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/src/components/NewCom/WkSignaturePad/VueSignaturePad/index.vue b/src/components/NewCom/WkSignaturePad/VueSignaturePad/index.vue new file mode 100644 index 0000000..422af27 --- /dev/null +++ b/src/components/NewCom/WkSignaturePad/VueSignaturePad/index.vue @@ -0,0 +1,196 @@ + + diff --git a/src/components/NewCom/WkSignaturePad/VueSignaturePad/signature.png b/src/components/NewCom/WkSignaturePad/VueSignaturePad/signature.png new file mode 100644 index 0000000..4459c99 Binary files /dev/null and b/src/components/NewCom/WkSignaturePad/VueSignaturePad/signature.png differ diff --git a/src/components/NewCom/WkSignaturePad/index.vue b/src/components/NewCom/WkSignaturePad/index.vue new file mode 100644 index 0000000..6f94ec3 --- /dev/null +++ b/src/components/NewCom/WkSignaturePad/index.vue @@ -0,0 +1,167 @@ + + + + + + + diff --git a/src/components/NewCom/WkSignaturePad/utils/index.js b/src/components/NewCom/WkSignaturePad/utils/index.js new file mode 100644 index 0000000..0819f06 --- /dev/null +++ b/src/components/NewCom/WkSignaturePad/utils/index.js @@ -0,0 +1,26 @@ +export const IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/svg+xml'] + +export const checkSaveType = type => IMAGE_TYPES.includes(type) + +export const DEFAULT_OPTIONS = { + dotSize: (0.5 + 2.5) / 2, + minWidth: 0.5, + maxWidth: 2.5, + throttle: 16, + minDistance: 5, + backgroundColor: 'rgba(0,0,0,0)', + penColor: 'black', + velocityFilterWeight: 0.7, + onBegin: () => {}, + onEnd: () => {} +} + +export const convert2NonReactive = observerValue => + JSON.parse(JSON.stringify(observerValue)) + +export const TRANSPARENT_PNG = { + src: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=', + x: 0, + y: 0 +} diff --git a/src/components/NewCom/WkUserSelect/src/WkUser.vue b/src/components/NewCom/WkUserSelect/src/WkUser.vue index 44c58fa..7643fa2 100644 --- a/src/components/NewCom/WkUserSelect/src/WkUser.vue +++ b/src/components/NewCom/WkUserSelect/src/WkUser.vue @@ -145,8 +145,10 @@ export default { } }) this.$emit('input', ids) + this.$emit('change', val) } else { this.$emit('input', []) + this.$emit('change', []) } }, diff --git a/src/components/SlideView.vue b/src/components/SlideView.vue index d1309c0..926841b 100644 --- a/src/components/SlideView.vue +++ b/src/components/SlideView.vue @@ -10,7 +10,7 @@ class="slide-detail-card-container"> @@ -218,8 +218,8 @@ export default { .close-btn { position: absolute; - top: 160px; - left: -40px; + top: 153px; + left: -46px; z-index: 1; border-top-right-radius: 0; border-bottom-right-radius: 0; @@ -227,6 +227,7 @@ export default { /deep/ i { font-size: 26px; + margin-left: 0; } } diff --git a/src/components/VDistpicker/Distpicker.vue b/src/components/VDistpicker/Distpicker.vue index 3bf7abf..03cb957 100644 --- a/src/components/VDistpicker/Distpicker.vue +++ b/src/components/VDistpicker/Distpicker.vue @@ -1,74 +1,27 @@ @@ -115,7 +111,7 @@ export default { handleCustomField(type, item, index) { if (type == 'edit') { this.$router.push({ - name: 'handlefield', + name: 'customField', params: { // type: { // 1: 'crm_leads', @@ -137,7 +133,9 @@ export default { 'crm_business': 5, 'crm_contract': 6, 'crm_receivables': 7, - 'crm_visit': 17 + 'crm_visit': 17, + 'crm_invoice': 18, + 'crm_receivables_plan': 19 }[item.types] } }) @@ -167,6 +165,10 @@ export default { return require('@/assets/img/crm/receivables.png') } else if (types === 'crm_visit') { return require('@/assets/img/crm/visit.png') + } else if (types === 'crm_invoice') { + return require('@/assets/img/crm/invoice.png') + } else if (types === 'crm_receivables_plan') { + return require('@/assets/img/crm/receivables_plan.png') } return require('@/assets/img/crm/product.png') } diff --git a/src/views/admin/fields/components/FieldItem/FieldBoolean.vue b/src/views/admin/fields/components/FieldItem/FieldBoolean.vue new file mode 100644 index 0000000..da185bb --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldBoolean.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldCheckbox.vue b/src/views/admin/fields/components/FieldItem/FieldCheckbox.vue new file mode 100644 index 0000000..89ee0c7 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldCheckbox.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldDateInterval.vue b/src/views/admin/fields/components/FieldItem/FieldDateInterval.vue new file mode 100644 index 0000000..9cb9294 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldDateInterval.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldDescText.vue b/src/views/admin/fields/components/FieldItem/FieldDescText.vue new file mode 100644 index 0000000..5aa02fe --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldDescText.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldDetailTable.vue b/src/views/admin/fields/components/FieldItem/FieldDetailTable.vue new file mode 100644 index 0000000..27a810f --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldDetailTable.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldFile.vue b/src/views/admin/fields/components/FieldItem/FieldFile.vue new file mode 100644 index 0000000..62411fe --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldFile.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldInput.vue b/src/views/admin/fields/components/FieldItem/FieldInput.vue new file mode 100644 index 0000000..834e2f1 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldInput.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldLocation.vue b/src/views/admin/fields/components/FieldItem/FieldLocation.vue new file mode 100644 index 0000000..22fa501 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldLocation.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldPercent.vue b/src/views/admin/fields/components/FieldItem/FieldPercent.vue new file mode 100644 index 0000000..d36328f --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldPercent.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldPosition.vue b/src/views/admin/fields/components/FieldItem/FieldPosition.vue new file mode 100644 index 0000000..dec4373 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldPosition.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldSelect.vue b/src/views/admin/fields/components/FieldItem/FieldSelect.vue new file mode 100644 index 0000000..c915f69 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldSelect.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldTextarea.vue b/src/views/admin/fields/components/FieldItem/FieldTextarea.vue new file mode 100644 index 0000000..4a99c9d --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldTextarea.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldWrapper.vue b/src/views/admin/fields/components/FieldItem/FieldWrapper.vue new file mode 100644 index 0000000..f37c982 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldWrapper.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/FieldWritingSign.vue b/src/views/admin/fields/components/FieldItem/FieldWritingSign.vue new file mode 100644 index 0000000..6d0dc09 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/FieldWritingSign.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/src/views/admin/fields/components/FieldItem/index.js b/src/views/admin/fields/components/FieldItem/index.js new file mode 100644 index 0000000..4fe0c3d --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/index.js @@ -0,0 +1,13 @@ +export { default as FieldInput } from './FieldInput' +export { default as FieldTextarea } from './FieldTextarea' +export { default as FieldSelect } from './FieldSelect' +export { default as FieldCheckbox } from './FieldCheckbox' +export { default as FieldFile } from './FieldFile' +export { default as FieldBoolean } from './FieldBoolean' +export { default as FieldPercent } from './FieldPercent' +export { default as FieldPosition } from './FieldPosition' +export { default as FieldLocation } from './FieldLocation' +export { default as FieldDetailTable } from './FieldDetailTable' +export { default as FieldWritingSign } from './FieldWritingSign' +export { default as FieldDateInterval } from './FieldDateInterval' +export { default as FieldDescText } from './FieldDescText' diff --git a/src/views/admin/fields/components/FieldItem/mixins.js b/src/views/admin/fields/components/FieldItem/mixins.js new file mode 100644 index 0000000..3217f37 --- /dev/null +++ b/src/views/admin/fields/components/FieldItem/mixins.js @@ -0,0 +1,132 @@ +import { getFieldAuth } from '../../utils' +import { isEmpty } from '@/utils/types' + +export default { + props: { + field: { // 当前字段信息 + type: Object, + required: true + }, + fieldArr: { // 全部字段数组,为空时则禁止点击改变位置 + type: Array, + default: () => [] + }, + point: { // 当前字段坐标 + type: Array + }, + activePoint: { // 选中的字段坐标 + type: Array, + default: () => [] + } + }, + data() { + return { + specialFormType: [ + // 'detail_table' // 明细表格 + ] + } + }, + computed: { + // 当前字段是否激活 + activate() { + return this.point[0] === this.activePoint[0] && + this.point[1] === this.activePoint[1] + }, + /** 只读 */ + disabled() { + return !this.fieldAuth.defaultEdit + }, + + fieldAuth() { + return getFieldAuth(this.field.operating) + }, + // 向上操作按钮 + topFlag() { + if (isEmpty(this.fieldArr)) return false + // 第一行、上一行有4个、上一行为特殊字段类型不显示 + const row = this.point[0] + if (row === 0) return false + const prevRow = this.fieldArr[row - 1] + if (prevRow.length === 4) return false + if (this.specialFormType.includes(prevRow[0].form_type)) return false + return true + }, + // 向下操作按钮 + bottomFlag() { + if (isEmpty(this.fieldArr)) return false + // 最后一行、当前行只有一个不显示 + const row = this.point[0] + if (row === this.fieldArr.length - 1) return false + // if (this.fieldArr[row].length <= 1) return false + return true + }, + // 左侧操作按钮 + leftFlag() { + if (isEmpty(this.fieldArr)) return false + // 第一列不显示 + const column = this.point[1] + if (column === 0) return false + return true + }, + // 右侧操作按钮 + rightFlag() { + if (isEmpty(this.fieldArr)) return false + // 最后一列不显示 + const column = this.point[1] + const row = this.point[0] + if (column === this.fieldArr[row].length - 1) return false + return true + }, + // 复制按钮 + copyFlag() { + if (isEmpty(this.fieldArr)) return false + return ![ + 'customer', + 'business', + 'contacts', + 'contract', + 'receivables_plan', + 'single_user' + ].includes(this.field.form_type) + }, + controlFlag() { + return { + top: this.topFlag, + bottom: this.bottomFlag, + left: this.leftFlag, + right: this.rightFlag, + delete: this.fieldAuth.deleteEdit, + copy: this.copyFlag + } + } + }, + // watch: { + // field: { + // handler() { + // this.$nextTick(() => { + // this.$forceUpdate() + // }) + // }, + // deep: true, + // immediate: true + // } + // }, + methods: { + /** + * click + * @param evt + */ + emitClick(evt) { + this.$emit('click', evt) + }, + + /** + * 点击删除 + * @param action + * @param evt + */ + handleAction(action, evt) { + this.$emit('action', action, this.point, evt) + } + } +} diff --git a/src/views/admin/fields/components/SettingField/SettingDefault.vue b/src/views/admin/fields/components/SettingField/SettingDefault.vue new file mode 100644 index 0000000..2d80f27 --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingDefault.vue @@ -0,0 +1,372 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingDescText.vue b/src/views/admin/fields/components/SettingField/SettingDescText.vue new file mode 100644 index 0000000..062d13e --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingDescText.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingDetailTable.vue b/src/views/admin/fields/components/SettingField/SettingDetailTable.vue new file mode 100644 index 0000000..6bfb81a --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingDetailTable.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingLogicForm.vue b/src/views/admin/fields/components/SettingField/SettingLogicForm.vue new file mode 100644 index 0000000..4ca26b5 --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingLogicForm.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingNumber.vue b/src/views/admin/fields/components/SettingField/SettingNumber.vue new file mode 100644 index 0000000..2007104 --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingNumber.vue @@ -0,0 +1,211 @@ + + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingOptions.vue b/src/views/admin/fields/components/SettingField/SettingOptions.vue new file mode 100644 index 0000000..21a5ebf --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingOptions.vue @@ -0,0 +1,395 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/SettingPrecisions.vue b/src/views/admin/fields/components/SettingField/SettingPrecisions.vue new file mode 100644 index 0000000..f00e58d --- /dev/null +++ b/src/views/admin/fields/components/SettingField/SettingPrecisions.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/views/admin/fields/components/SettingField/index.vue b/src/views/admin/fields/components/SettingField/index.vue new file mode 100644 index 0000000..c24c4b1 --- /dev/null +++ b/src/views/admin/fields/components/SettingField/index.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/src/views/admin/fields/field.js b/src/views/admin/fields/field.js new file mode 100644 index 0000000..6c0126d --- /dev/null +++ b/src/views/admin/fields/field.js @@ -0,0 +1,39 @@ +export default class Field { + constructor(obj) { + this.field_type = 0 // 新增字段默认加入0 1是系统字段 2 客户行业 级别 来源 等 3 特殊 + this.field_id = obj.field_id || '' // 字段id 1 + this.name = obj.name || '' // 标识名 1 + this.form_type = obj.form_type || '' // 字段类型 1 + this.is_unique = obj.is_unique || 0 // 是否唯一 + this.is_null = obj.is_null || 0 // 是否必填 + this.is_hidden = obj.is_hidden || 0 // 是否隐藏字段 + this.input_tips = obj.input_tips || '' // 输入提示 + if (this.form_type === 'textarea') { + this.max_length = obj.max_length || 800 // textarea 多行文本有最大数量 + } + + if (this.form_type === 'checkbox') { + this.default_value = obj.default_value || [] + } else { + this.default_value = obj.default_value || '' + } + + // 表格的特殊处理 + if (this.form_type === 'form') { + this.formValue = obj.formValue || [] // 内部布局 + } + + this.setting = obj.setting || [] // 单选选项 + // this.showSetting = obj.showSetting || [] // 单选选项 + // this.componentName = '' // 组件名字 + this.is_deleted = 0 // 是删除标示这个字段是无效的 1是无效的 + } + + // 校验数据 + check() { + if (this.name === '') { + return '字段名称不能为空' + } + return '' + } +} diff --git a/src/views/admin/fields/fieldTypeLib.js b/src/views/admin/fields/fieldTypeLib.js new file mode 100644 index 0000000..95b8957 --- /dev/null +++ b/src/views/admin/fields/fieldTypeLib.js @@ -0,0 +1,163 @@ +export default [{ + componentName: 'FieldInput', + form_type: 'text', + name: '单行文本', + type: 1, + icon: 'wk wk-icon-text' +}, +{ + componentName: 'FieldTextarea', + form_type: 'textarea', + name: '多行文本', + type: 2, + icon: 'wk wk-icon-textarea' +}, +{ + componentName: 'FieldInput', + form_type: 'website', + name: '网址', + type: 25, + icon: 'wk wk-icon-website' +}, + +{ + componentName: 'FieldBoolean', + form_type: 'boolean_value', + name: '布尔值', + type: 41, + icon: 'wk wk-icon-bool' +}, +{ + componentName: 'FieldSelect', + form_type: 'select', + name: '单选', + type: 3, + icon: 'wk wk-icon-select' +}, +{ + componentName: 'FieldCheckbox', + form_type: 'checkbox', + name: '多选', + type: 9, + icon: 'wk wk-icon-checkbox' +}, +{ + componentName: 'FieldInput', + form_type: 'number', + name: '数字', + type: 5, + icon: 'wk wk-icon-int' +}, +{ + componentName: 'FieldInput', + form_type: 'floatnumber', + name: '货币', + type: 6, + icon: 'wk wk-icon-coin' +}, +{ + componentName: 'FieldPercent', + form_type: 'percent', + name: '百分数', + type: 42, + icon: 'wk wk-icon-percent' +}, +{ + componentName: 'FieldInput', + form_type: 'mobile', + name: '手机', + type: 7, + icon: 'wk wk-icon-mobile' +}, +{ + componentName: 'FieldInput', + form_type: 'email', + name: '邮箱', + type: 14, + icon: 'wk wk-icon-email' +}, +{ + componentName: 'FieldInput', + form_type: 'date', + name: '日期', + type: 4, + icon: 'wk wk-icon-date' +}, +{ + componentName: 'FieldInput', + form_type: 'datetime', + name: '日期时间', + type: 13, + icon: 'wk wk-icon-datetime' +}, +{ + componentName: 'FieldDateInterval', + form_type: 'date_interval', + name: '日期区间', + type: 48, + icon: 'wk wk-icon-range' +}, +{ + componentName: 'FieldPosition', + form_type: 'position', + name: '地址', + type: 43, + icon: 'wk wk-icon-address' +}, +{ + componentName: 'FieldLocation', + form_type: 'location', + name: '定位', + type: 44, + icon: 'wk wk-icon-nav' +}, +{ + componentName: 'FieldInput', + form_type: 'user', + name: '人员', + type: 10, + icon: 'wk wk-icon-user-data' +}, +{ + componentName: 'FieldInput', + form_type: 'structure', + name: '部门', + type: 12, + icon: 'wk wk-icon-users' +}, +{ + componentName: 'FieldFile', + form_type: 'file', + name: '附件', + type: 8, + icon: 'wk wk-icon-file' +}, +{ + componentName: 'FieldWritingSign', + form_type: 'handwriting_sign', + name: '手写签名', + type: 46, + icon: 'wk wk-icon-signature' +}, +{ + componentName: 'FieldDescText', + form_type: 'desc_text', + name: '描述文字', + type: 50, + icon: 'wk wk-icon-des' +}, +{ + componentName: 'FieldDetailTable', + form_type: 'detail_table', + name: '明细表格', + type: 45, + icon: 'wk wk-icon-file' +} +] + +export const picField = { + componentName: 'FieldInput', + form_type: 'pic', + name: '图片', + icon: 'wk ' +} diff --git a/src/views/admin/fields/index.vue b/src/views/admin/fields/index.vue new file mode 100644 index 0000000..4e9ad40 --- /dev/null +++ b/src/views/admin/fields/index.vue @@ -0,0 +1,940 @@ + + + + + diff --git a/src/views/admin/fields/utils.js b/src/views/admin/fields/utils.js new file mode 100644 index 0000000..7c32e92 --- /dev/null +++ b/src/views/admin/fields/utils.js @@ -0,0 +1,67 @@ +export function getFieldAuth(operating) { + const binaryStr = operating.toString(2).padStart(8, '0') + // console.log('binaryStr: ', operating, binaryStr) + return { + nameEdit: Boolean(Number(binaryStr.charAt(0))), // 是否可编辑字段名 + deleteEdit: Boolean(Number(binaryStr.charAt(1))), // 是否可删除字段 + defaultEdit: Boolean(Number(binaryStr.charAt(2))), // 可编辑 + percentEdit: Boolean(Number(binaryStr.charAt(3))), // 是否允许修改字段占比 + nullEdit: Boolean(Number(binaryStr.charAt(4))), // 是否可设置为必填 + uniqueEdit: Boolean(Number(binaryStr.charAt(5))), // 是否可设置为唯一 + hiddenEdit: Boolean(Number(binaryStr.charAt(6))), // 是否可隐藏字段 + optionsEdit: Boolean(Number(binaryStr.charAt(7))) // 是否允许编辑选项 + } +} + +export function typeToComponent(item) { + if (item.type === 0) return 'FieldInput' + if ([ + 'text', + 'number', + 'floatnumber', + 'mobile', + 'email', + 'date', + 'datetime', + 'user', + 'structure', + 'contacts', + 'customer', + 'contract', + 'business', + 'single_user', + 'website' + ].includes(item.form_type)) { + return 'FieldInput' + } + switch (item.form_type) { + case 'textarea': // 多行文本 + return 'FieldTextarea' + case 'select': // 选项 + return 'FieldSelect' + case 'checkbox': // 多选 + return 'FieldCheckbox' + case 'file': // 附件 + return 'FieldFile' + case 'boolean_value': // 布尔 + return 'FieldBoolean' + case 'percent': // 百分数 + return 'FieldPercent' + case 'position': // 地区定位 + return 'FieldPosition' + case 'location': // 定位 + return 'FieldLocation' + case 'detail_table': // 明细表格 + return 'FieldDetailTable' + case 'handwriting_sign': // 手写签名 + return 'FieldWritingSign' + case 'date_interval': // 日期区间 + return 'FieldDateInterval' + case 'desc_text': // 描述文字 + return 'FieldDescText' + // case 'form': + // return 'FieldTextarea' + default: + return 'FieldInput' + } +} diff --git a/src/views/admin/roleAuth/components/RoleRangeSetDialog.vue b/src/views/admin/roleAuth/components/RoleRangeSetDialog.vue new file mode 100644 index 0000000..306d018 --- /dev/null +++ b/src/views/admin/roleAuth/components/RoleRangeSetDialog.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/views/admin/roleAuth/index.vue b/src/views/admin/roleAuth/index.vue index fe473e9..514bd14 100644 --- a/src/views/admin/roleAuth/index.vue +++ b/src/views/admin/roleAuth/index.vue @@ -173,11 +173,18 @@ default-expand-all> {{ node.label }}{{ node.label }}字段授权 + @click="fieldSetClick(node)" >字段授权 + + 配置查看范围 + @@ -221,6 +228,13 @@ :visible.sync="editRoleDialogShow" @change="getUserList" /> + + + @@ -242,6 +256,8 @@ import FieldSetDialog from './components/FieldSetDialog' import Reminder from '@/components/Reminder' import XrHeader from '@/components/XrHeader' import EditRoleDialog from '../employeeDep/components/EditRoleDialog' +import RoleRangeSetDialog from './components/RoleRangeSetDialog' +import { mapGetters } from 'vuex' import crmTypeModel from '@/views/crm/model/crmTypeModel' @@ -251,7 +267,8 @@ export default { FieldSetDialog, Reminder, XrHeader, - EditRoleDialog + EditRoleDialog, + RoleRangeSetDialog }, data() { @@ -306,11 +323,17 @@ export default { // 角色操作 selectionList: [], editRoleType: '', - editRoleDialogShow: false + editRoleDialogShow: false, + + // 角色范围设置 + setRoleRangeShow: false } }, computed: { + ...mapGetters([ + 'userInfo' + ]), id() { if (this.roleActive) { return this.roleActive.id @@ -859,7 +882,7 @@ export default { */ canSetField(type, data) { if (this.pid == 10) return false - return ['leads', 'customer', 'contacts', 'business', 'contract', 'receivables', 'product', 'visit'].includes(type) && + return ['leads', 'customer', 'contacts', 'business', 'contract', 'receivables', 'product', 'visit', 'invoice'].includes(type) && this.ruleMenuIndex === 'data' }, @@ -869,6 +892,12 @@ export default { fieldSetClick(node) { this.setFieldLabel = crmTypeModel.keyToTypeData[node.data.name] this.setFieldShow = true + }, + /** + * 权限设置 + */ + checkRangeSetClick(node) { + this.setRoleRangeShow = true } } } @@ -1115,6 +1144,17 @@ export default { } } } +.common-node-label { + position: relative; + .el-button { + position: absolute; + top: -8px; + right: -105px; + /deep/ span { + margin-left: 3px; + } + } +} @import '../styles/table.scss'; diff --git a/src/views/crm/business/Create.vue b/src/views/crm/business/Create.vue index 2afb0fa..1a602e9 100644 --- a/src/views/crm/business/Create.vue +++ b/src/views/crm/business/Create.vue @@ -5,47 +5,54 @@ @close="close" @save="saveClick"> - - - + + + + @@ -56,7 +63,8 @@ import { crmBusinessSaveAPI } from '@/api/crm/business' import XrCreate from '@/components/XrCreate' import CreateSections from '@/components/CreateSections' -import WkForm from '@/components/NewCom/WkForm' +import WkFormItems from '@/components/NewCom/WkForm/WkFormItems' + import { XhBusinessStatus, XhProduct, @@ -76,7 +84,7 @@ export default { CrmRelativeCell, XhBusinessStatus, XhProduct, - WkForm + WkFormItems }, mixins: [CustomFieldsMixin], @@ -131,7 +139,8 @@ export default { types: 'crm_business', module: 'crm', controller: 'business', - action: this.action.type + action: this.action.type, + format: 2 } if (this.action.type == 'update') { @@ -141,64 +150,70 @@ export default { filedGetFieldAPI(params) .then(res => { const list = res.data || [] + const assistIds = this.getFormAssistIds(list) + const baseFields = [] const fieldList = [] const fieldRules = {} const fieldForm = {} - list.forEach(item => { - const temp = {} - temp.field = item.field - temp.formType = item.form_type - temp.fieldId = item.fieldId - temp.inputTips = item.input_tips - temp.name = item.name - temp.setting = item.setting - temp.value = item.value - const canEdit = this.getItemIsCanEdit(item, this.action.type) - // 是否能编辑权限 - if (canEdit) { - fieldRules[temp.field] = this.getRules(item) - } + list.forEach(children => { + const fields = [] + children.forEach(item => { + const temp = this.getFormItemDefaultProperty(item) + temp.show = !assistIds.includes(item.formAssistId) + + const canEdit = this.getItemIsCanEdit(item, this.action.type) + // 是否能编辑权限 + if (temp.show && canEdit) { + fieldRules[temp.field] = this.getRules(item) + } - // 是否可编辑 - temp.disabled = !canEdit + // 是否可编辑 + temp.disabled = !canEdit - // 禁止某些业务组件选择 - if (temp.formType == 'customer') { - if (this.action.type == 'relative') { - const relativeDisInfos = { - customer: { customer: true }, - contacts: { customer: true } - } + // 禁止某些业务组件选择 + if (temp.form_type == 'customer') { + if (this.action.type == 'relative') { + const relativeDisInfos = { + customer: { customer: true }, + contacts: { customer: true } + } - // 在哪个类型下添加 - const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] - if (relativeTypeDisInfos) { + // 在哪个类型下添加 + const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] + if (relativeTypeDisInfos) { // 包含的字段值 - temp.disabled = relativeTypeDisInfos[item.form_type] || false + temp.disabled = relativeTypeDisInfos[item.form_type] || false + } } } - } - if (this.action.type == 'update' && temp.formType == 'business_status') { - temp.disabled = true - } - // 特殊字段允许多选 - this.getItemRadio(item, temp) - // 获取默认值 - fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) - fieldList.push(temp) + // 特殊字段允许多选 + this.getItemRadio(item, temp) + + if (item.form_type === 'business_status') { + temp.disabled = this.action.type === 'update' + } + + // 获取默认值 + if (temp.show) { + fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) + } + fields.push(temp) + baseFields.push(item) + }) + fieldList.push(fields) }) - this.baseFields = list + this.baseFields = baseFields this.fieldList = fieldList this.fieldForm = fieldForm this.fieldRules = fieldRules - this.loading = false }) - .catch(() => { + .catch((e) => { + console.log(e) this.loading = false }) }, @@ -208,7 +223,7 @@ export default { */ saveClick() { this.loading = true - const crmForm = this.$refs.crmForm.instance + const crmForm = this.$refs.crmForm crmForm.validate(valid => { if (valid) { @@ -275,6 +290,16 @@ export default { * change */ formChange(field, index, value, valueList) { + if ([ + 'select', + 'checkbox' + ].includes(field.form_type) && + field.remark === 'options_type' && + field.optionsData) { + const { fieldForm, fieldRules } = this.getFormContentByOptionsChange(this.fieldList, this.fieldForm) + this.fieldForm = fieldForm + this.fieldRules = fieldRules + } }, /** @@ -282,8 +307,8 @@ export default { */ otherChange(data, field) { console.log(data, field) - if (field.formType === 'business_type') { - const statusItem = this.fieldList.find(item => item.formType === 'business_status') + if (field.form_type === 'business_type') { + const statusItem = this.getItemWithFromType(this.fieldList, 'business_status') if (statusItem) { if (isEmpty(data.value)) { this.fieldForm[field.field] = '' @@ -298,11 +323,11 @@ export default { this.$set(this.fieldForm, statusItem.field, statusItem.setting.length > 0 ? statusItem.setting[0].status_id : '') } } - } else if (field.formType === 'product') { + } else if (field.form_type === 'product') { this.fieldForm.money = data.value.total_price || '' } this.$set(this.fieldForm, field.field, data.value) - this.$refs.crmForm.instance.validateField(field.field) + this.$refs.crmForm.validateField(field.field) }, /** diff --git a/src/views/crm/business/Detail.vue b/src/views/crm/business/Detail.vue index 64f8a33..7e15a0c 100644 --- a/src/views/crm/business/Detail.vue +++ b/src/views/crm/business/Detail.vue @@ -23,6 +23,8 @@ :head-details="headDetails" :id="id" :crm-type="crmType" + :page-list="pageList" + @pageChange="pageChange" @handle="detailHeadHandle" @close="hideView"> +
diff --git a/src/views/crm/components/CRMAllDetail.vue b/src/views/crm/components/CRMAllDetail.vue index b280e34..9712572 100644 --- a/src/views/crm/components/CRMAllDetail.vue +++ b/src/views/crm/components/CRMAllDetail.vue @@ -4,10 +4,12 @@ :is="tabName" :crm-type="crmType" :id="id" + v-bind="$attrs" :listener-ids="listenerIDs" :no-listener-ids="noListenerIDs" :no-listener-class="noListenerClass" class="d-view" + v-on="$listeners" @handle="detailHandle" @hide-view="hiddenView"/> diff --git a/src/views/crm/components/CRMDetailHead.vue b/src/views/crm/components/CRMDetailHead.vue index 24ae370..25bb2f9 100644 --- a/src/views/crm/components/CRMDetailHead.vue +++ b/src/views/crm/components/CRMDetailHead.vue @@ -8,13 +8,18 @@ class="t-section__hd">
{{ typeName }}
-

- {{ name }} -

+
{{ name }}
+ + + + + +
{ return [] } - } + }, + pageList: Array }, data() { return { @@ -667,6 +673,29 @@ export default { } } + + + diff --git a/src/views/crm/components/SelectionHandle/TeamsHandle.vue b/src/views/crm/components/SelectionHandle/TeamsHandle.vue index ab33f16..51d9826 100644 --- a/src/views/crm/components/SelectionHandle/TeamsHandle.vue +++ b/src/views/crm/components/SelectionHandle/TeamsHandle.vue @@ -9,6 +9,7 @@ @close="handleCancel">
权限:
- 只读 - 读写 + 只读 + + + 读写 + + -
同时添加至:
+
{{ isCreate ? '同时添加至' : '同时移除' }}:
- + 联系人 商机 合同
+ +
有效时间:
+ + + + + +
import { XhUserCell } from '@/components/CreateCom' import { - crmCustomerSettingTeamSaveAPI, - crmCustomerSettingTeamDeleteAPI + crmCustomerSettingTeamSaveAPI + // crmCustomerSettingTeamDeleteAPI } from '@/api/crm/customer' -import { - crmContractSettingTeamSaveAPI, - crmContractSettingTeamDeleteAPI -} from '@/api/crm/contract' +// import { +// crmContractSettingTeamSaveAPI, +// crmContractSettingTeamDeleteAPI +// } from '@/api/crm/contract' -import { - crmBusinessSettingTeamSaveAPI, - crmBusinessSettingTeamDeleteAPI -} from '@/api/crm/business' +// import { +// crmBusinessSettingTeamSaveAPI, +// crmBusinessSettingTeamDeleteAPI +// } from '@/api/crm/business' export default { /** 客户管理 的 勾选后的 团队成员 操作 移除操作不可移除客户负责人*/ @@ -84,10 +115,10 @@ export default { required: true, default: false }, - title: { - type: String, - default: '' - }, + // title: { + // type: String, + // default: '' + // }, /** 没有值就是全部类型 有值就是当个类型 */ crmType: { type: String, @@ -99,19 +130,48 @@ export default { default: () => { return [] } - } + }, + // add 添加 delete 移除 + type: { + type: String, + default: '' + }, + // 选择的成员,该字段存在,将不展示员工选择 + members: Array }, data() { return { loading: false, // 加载动画 visible: false, - + pickerOptions: { + disabledDate(time) { + // 当前0点时间戳 + return time.getTime() < new Date(new Date().toLocaleDateString()).getTime() + } + }, usersList: [], // 变更负责人 handleType: 1, // 操作类型 - addsTypes: [] // 添加至 + addsTypes: [], // 添加至 + validType: '', // 有效类型 + target_time: '' // 有效时间 + } + }, + computed: { + // 客户允许同时添加至联系人 + addsTypesShow() { + return this.crmType === 'customer' + }, + // 是新建 + isCreate() { + return this.type === 'add' + }, + title() { + return { + add: '添加团队成员', + delete: '移除团队成员' + }[this.type] } }, - computed: {}, watch: { dialogVisible: { handler(val) { @@ -150,39 +210,57 @@ export default { }, handleConfirm() { // 移除操作不可移除客户负责人 - if (this.usersList.length === 0) { + if (!this.members && this.usersList.length === 0) { this.$message.error('请选择团队成员') + } else if (this.validType === 'end' && !this.target_time) { + this.$message.error('请选择截止日期') } else { const params = { types_id: this.selectionList.map(item => item[this.crmType + '_id']), user_id: this.usersList.map(item => item.id) } - if (this.crmType === 'customer' && this.title == '添加团队成员') { + // 如果有传入成员,替换选择成员 + if (this.members) { + params.user_id = this.members.map(item => item.id) + } + // if (this.addsTypesShow) { + // // 只有客户下面同时添加到 + // params.changeType = this.addsTypes.map(function(i) { + // return parseInt(i) + // }) + // } + // if (this.crmType === 'customer' && this.title == '添加团队成员') { + // // 只有客户下面同时添加到 + // params.module = this.addsTypes + // } + if (this.addsTypesShow) { // 只有客户下面同时添加到 params.module = this.addsTypes } - let request - if (this.title == '添加团队成员') { + params.target_time = this.validType === 'end' ? this.target_time : '' + + // let request + if (this.isCreate) { // 1只读,2读写 params.type = this.handleType - request = { - customer: crmCustomerSettingTeamSaveAPI, - contract: crmContractSettingTeamSaveAPI, - business: crmBusinessSettingTeamSaveAPI - }[this.crmType] + // request = { + // customer: crmCustomerSettingTeamSaveAPI, + // contract: crmContractSettingTeamSaveAPI, + // business: crmBusinessSettingTeamSaveAPI + // }[this.crmType] } else { - request = { - customer: crmCustomerSettingTeamDeleteAPI, - contract: crmContractSettingTeamDeleteAPI, - business: crmBusinessSettingTeamDeleteAPI - }[this.crmType] + // request = { + // customer: crmCustomerSettingTeamDeleteAPI, + // contract: crmContractSettingTeamDeleteAPI, + // business: crmBusinessSettingTeamDeleteAPI + // }[this.crmType] params.is_del = 1 } this.loading = true params.types = 'crm_' + this.crmType - request(params) + crmCustomerSettingTeamSaveAPI(params) .then(res => { this.$message({ type: 'success', @@ -191,7 +269,7 @@ export default { this.loading = false this.handleCancel() this.$emit('handle', { - type: this.title == '添加团队成员' ? 'add_user' : 'delete_user' + type: this.isCreate ? 'add_user' : 'delete_user' }) }) .catch(() => { diff --git a/src/views/crm/contacts/Create.vue b/src/views/crm/contacts/Create.vue index 4601923..b1adfca 100644 --- a/src/views/crm/contacts/Create.vue +++ b/src/views/crm/contacts/Create.vue @@ -5,25 +5,32 @@ @close="close" @save="saveClick"> - - - + + + + @@ -34,7 +41,8 @@ import { crmContactsSaveAPI } from '@/api/crm/contacts' import XrCreate from '@/components/XrCreate' import CreateSections from '@/components/CreateSections' -import WkForm from '@/components/NewCom/WkForm' +import WkFormItems from '@/components/NewCom/WkForm/WkFormItems' + import { CrmRelativeCell } from '@/components/CreateCom' @@ -50,7 +58,7 @@ export default { XrCreate, CreateSections, CrmRelativeCell, - WkForm + WkFormItems }, mixins: [CustomFieldsMixin], @@ -106,7 +114,8 @@ export default { types: 'crm_contacts', module: 'crm', controller: 'contacts', - action: this.action.type + action: this.action.type, + format: 2 } if (this.action.type == 'update') { @@ -118,57 +127,64 @@ export default { const list = res.data || [] if (!isEmpty(this.phone)) { list.forEach(item => { - if (item.formType === 'mobile') { - item.defaultValue = this.phone + if (item.form_type === 'mobile') { + item.default_value = this.phone } }) } + const assistIds = this.getFormAssistIds(list) + const baseFields = [] + const fieldList = [] const fieldRules = {} const fieldForm = {} - list.forEach(item => { - const temp = {} - temp.field = item.field - temp.formType = item.form_type - temp.fieldId = item.fieldId - temp.inputTips = item.input_Tips - temp.name = item.name - temp.setting = item.setting - // temp.value = item.value - const canEdit = this.getItemIsCanEdit(item, this.action.type) - // 是否能编辑权限 - if (canEdit) { - fieldRules[temp.field] = this.getRules(item) - } - - // 是否可编辑 - temp.disabled = !canEdit - - // 禁止某些业务组件选择 - if (temp.formType == 'customer') { - if (this.action.type == 'relative') { - const relativeDisInfos = { - customer: { customer: true }, - business: { customer: true } - } - // 在哪个类型下添加 - const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] - if (relativeTypeDisInfos) { + list.forEach(children => { + const fields = [] + children.forEach(item => { + const temp = this.getFormItemDefaultProperty(item) + temp.show = !assistIds.includes(item.formAssistId) + + const canEdit = this.getItemIsCanEdit(item, this.action.type) + // 是否能编辑权限 + if (temp.show && canEdit) { + fieldRules[temp.field] = this.getRules(item) + } + + // 是否可编辑 + temp.disabled = !canEdit + + // 禁止某些业务组件选择 + if (temp.form_type == 'customer') { + if (this.action.type == 'relative') { + const relativeDisInfos = { + customer: { customer: true }, + business: { customer: true } + } + + // 在哪个类型下添加 + const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] + if (relativeTypeDisInfos) { // 包含的字段值 - temp.disabled = relativeTypeDisInfos[item.form_type] || false + temp.disabled = relativeTypeDisInfos[item.form_type] || false + } } } - } - // 特殊字段允许多选 - this.getItemRadio(item, temp) - // 获取默认值 - fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) - fieldList.push(temp) + // 特殊字段允许多选 + this.getItemRadio(item, temp) + + // 获取默认值 + if (temp.show) { + fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) + } + fields.push(temp) + baseFields.push(item) + }) + fieldList.push(fields) }) - this.baseFields = list + this.baseFields = baseFields this.fieldList = fieldList this.fieldForm = fieldForm this.fieldRules = fieldRules @@ -186,7 +202,7 @@ export default { */ saveClick() { this.loading = true - const crmForm = this.$refs.crmForm.instance + const crmForm = this.$refs.crmForm crmForm.validate(valid => { if (valid) { const params = this.getSubmiteParams(this.baseFields, this.fieldForm) @@ -248,14 +264,25 @@ export default { /** * change */ - formChange(item, index, value, valueList) {}, + formChange(field, index, value, valueList) { + if ([ + 'select', + 'checkbox' + ].includes(field.formType) && + field.remark === 'options_type' && + field.optionsData) { + const { fieldForm, fieldRules } = this.getFormContentByOptionsChange(this.fieldList, this.fieldForm) + this.fieldForm = fieldForm + this.fieldRules = fieldRules + } + }, /** * 地址change */ otherChange(data, field) { this.$set(this.fieldForm, field.field, data.value) - this.$refs.crmForm.instance.validateField(field.field) + this.$refs.crmForm.validateField(field.field) }, /** diff --git a/src/views/crm/contacts/Detail.vue b/src/views/crm/contacts/Detail.vue index 9470cb3..ed6ed15 100644 --- a/src/views/crm/contacts/Detail.vue +++ b/src/views/crm/contacts/Detail.vue @@ -22,7 +22,9 @@ :detail="detailData" :head-details="headDetails" :id="id" + :page-list="pageList" :crm-type="crmType" + @pageChange="pageChange" @handle="detailHeadHandle" @close="hideView"> +
diff --git a/src/views/crm/contract/Create.vue b/src/views/crm/contract/Create.vue index d96cf09..99bca68 100644 --- a/src/views/crm/contract/Create.vue +++ b/src/views/crm/contract/Create.vue @@ -6,38 +6,45 @@ @close="close" @save="saveClick"> - - - + + + + { const list = res.data || [] + const assistIds = this.getFormAssistIds(list) + const baseFields = [] const fieldList = [] const fieldRules = {} const fieldForm = {} - list.forEach(item => { - const temp = {} - temp.field = item.field - temp.formType = item.form_type - temp.fieldId = item.fieldId - temp.inputTips = item.input_tips - temp.name = item.name - temp.setting = item.setting - temp.value = item.value - const canEdit = this.getItemIsCanEdit(item, this.action.type) - // 是否能编辑权限 - if (canEdit) { + list.forEach(children => { + const fields = [] + children.forEach(item => { + const temp = this.getFormItemDefaultProperty(item) + temp.show = !assistIds.includes(item.formAssistId) + + const canEdit = this.getItemIsCanEdit(item, this.action.type) + // 是否能编辑权限 + if (canEdit) { // 自动生成编号 - if (item.autoGeneNumber == 1) { - temp.placeholder = '根据编号规则自动生成,支持手动输入' - const copyItem = objDeepCopy(item) - copyItem.isNull = 0 - fieldRules[temp.field] = this.getRules(copyItem) - } else { - fieldRules[temp.field] = this.getRules(item) + if (item.autoGeneNumber == 1) { + temp.placeholder = '根据编号规则自动生成,支持手动输入' + const copyItem = objDeepCopy(item) + copyItem.isNull = 0 + fieldRules[temp.field] = this.getRules(copyItem) + } else { + fieldRules[temp.field] = this.getRules(item) + } } - } - // 是否可编辑 - temp.disabled = !canEdit - - // 禁止某些业务组件选择 - if (temp.formType == 'contacts' || - temp.formType == 'customer' || - temp.formType == 'business' - ) { - if (this.action.type == 'relative') { - const relativeDisInfos = { - contacts: { customer: true }, - customer: { customer: true }, - business: { customer: true, business: true } - } + // 是否可编辑 + temp.disabled = !canEdit + + // 禁止某些业务组件选择 + if (temp.form_type == 'contacts' || + temp.form_type == 'customer' || + temp.form_type == 'business' + ) { + if (this.action.type == 'relative') { + const relativeDisInfos = { + contacts: { customer: true }, + customer: { customer: true }, + business: { customer: true, business: true } + } - // 在哪个类型下添加 - const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] - if (relativeTypeDisInfos) { + // 在哪个类型下添加 + const relativeTypeDisInfos = relativeDisInfos[this.action.crmType] + if (relativeTypeDisInfos) { // 包含的字段值 - temp.disabled = relativeTypeDisInfos[item.form_type] || false + temp.disabled = relativeTypeDisInfos[item.form_type] || false + } + } else if (this.action.type != 'update') { + temp.disabled = item.form_type === 'business' || item.form_type === 'contacts' } - } else if (this.action.type != 'update') { - temp.disabled = item.form_type === 'business' || item.form_type === 'contacts' } - } - // 处理关联 - if ((this.action.type == 'relative' || this.action.type == 'update') && (item.form_type == 'business' || item.form_type == 'contacts' || item.form_type == 'contract' - )) { - const customerItem = this.getItemRelatveInfo(list, 'customer') - if (customerItem) { - if (item.form_type == 'business' || item.form_type == 'contacts') { - customerItem['moduleType'] = 'customer' - temp['relation'] = customerItem - } else if (item.formType == 'contract') { - customerItem['moduleType'] = 'customer' - customerItem['params'] = { checkStatus: 2 } - temp['relation'] = customerItem + // 处理关联 + if ((this.action.type == 'relative' || this.action.type == 'update') && (item.form_type == 'business' || item.form_type == 'contacts' || item.form_type == 'contract' + )) { + const customerItem = this.getItemRelatveInfo(list, 'customer') + if (customerItem) { + if (item.form_type == 'business' || item.form_type == 'contacts') { + customerItem['moduleType'] = 'customer' + temp['relation'] = customerItem + } else if (item.form_type == 'contract') { + customerItem['moduleType'] = 'customer' + customerItem['params'] = { checkStatus: 2 } + temp['relation'] = customerItem + } } } - } - // 特殊字段允许多选 - this.getItemRadio(item, temp) + // 特殊字段允许多选 + this.getItemRadio(item, temp) - // 获取默认值 - // 非编辑情况下 填充默认值 - if (this.action.type != 'update' && item.field === 'order_date') { - fieldForm[temp.field] = this.$moment().format('YYYY-MM-DD') - } else { - fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) - } - fieldList.push(temp) + // 获取默认值 + // 非编辑情况下 填充默认值 + if (this.action.type != 'update' && item.field === 'order_date') { + fieldForm[temp.field] = this.$moment().format('YYYY-MM-DD') + } else { + fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) + } + fields.push(temp) + baseFields.push(item) + }) + fieldList.push(fields) }) @@ -286,7 +294,7 @@ export default { } } - this.baseFields = list + this.baseFields = baseFields this.fieldList = fieldList this.fieldForm = fieldForm this.fieldRules = fieldRules @@ -304,7 +312,7 @@ export default { */ saveClick(isDraft = false) { this.loading = true - const crmForm = this.$refs.crmForm.instance + const crmForm = this.$refs.crmForm crmForm.validate(valid => { if (valid) { if (this.isOpenExamine) { @@ -410,86 +418,102 @@ export default { * change */ formChange(field, index, value, valueList) { + // 审批流逻辑 + // this.debouncedGetWkFlowList(field.field, this.fieldForm) + + if ([ + 'select', + 'checkbox' + ].includes(field.form_type) && + field.remark === 'options_type' && + field.optionsData) { + const { fieldForm, fieldRules } = this.getFormContentByOptionsChange(this.fieldList, this.fieldForm) + this.fieldForm = fieldForm + this.fieldRules = fieldRules + } }, /** * 地址change */ otherChange(data, field) { - if (field.formType === 'customer') { + if (field.form_type === 'customer') { let contractForCount = 0 - for (let index = 0; index < this.fieldList.length; index++) { - const element = this.fieldList[index] - // 需要处理 需关联客户信息或客户下信息 - const handleFields = [ - 'business_id', - 'contacts_id', - 'order_user_id' - ] - - // 添加请求关联 - const addRelation = ['business_id', 'contacts_id'] - - // 需要disabled - const addDisabled = ['business_id', 'contacts_id'] - - // 复制 - const getValueObj = { - contacts_id: data => { - if (!data.contacts_id) { - return [] - } - return [ - { - name: data.contactsName || '', - contacts_id: data.contacts_id + for (let mainIndex = 0; mainIndex < this.fieldList.length; mainIndex++) { + const children = this.fieldList[mainIndex] + for (let index = 0; index < children.length; index++) { + const element = children[index] + // 需要处理 需关联客户信息或客户下信息 + const handleFields = [ + 'business_id', + 'contacts_id', + 'order_user_id' + ] + + // 添加请求关联 + const addRelation = ['business_id', 'contacts_id'] + + // 需要disabled + const addDisabled = ['business_id', 'contacts_id'] + + // 复制 + const getValueObj = { + contacts_id: data => { + if (!data.contacts_id) { + return [] } - ] - }, - order_user_id: data => { - if (!data.ownerUserId) { - return [] - } - return [ - { - realname: data.owner_user_name || '', - id: data.owner_user_id + return [ + { + name: data.contactsName || '', + contacts_id: data.contacts_id + } + ] + }, + order_user_id: data => { + if (!data.ownerUserId) { + return [] } - ] + return [ + { + realname: data.owner_user_name || '', + id: data.owner_user_id + } + ] + } } - } - if (handleFields.includes(element.field)) { - if (data.value.length > 0) { - element.disabled = false + if (handleFields.includes(element.field)) { + if (data.value.length > 0) { + element.disabled = false - // 增加关联信息 - const customerItem = data.value[0] - if (addRelation.includes(element.field)) { - customerItem['moduleType'] = 'customer' - element['relation'] = customerItem - } + // 增加关联信息 + const customerItem = data.value[0] + if (addRelation.includes(element.field)) { + customerItem['moduleType'] = 'customer' + element['relation'] = customerItem + } - // 填充值 - if (getValueObj[element.field]) { - this.fieldForm[element.field] = getValueObj[element.field](customerItem) + // 填充值 + if (getValueObj[element.field]) { + this.fieldForm[element.field] = getValueObj[element.field](customerItem) + } else { + this.fieldForm[element.field] = [] + } } else { - this.fieldForm[element.field] = [] - } - } else { // 禁用 - element.disabled = !!addDisabled.includes(element.field) + element.disabled = !!addDisabled.includes(element.field) - if (addRelation.includes(element.field)) { - element['relation'] = {} - } + if (addRelation.includes(element.field)) { + element['relation'] = {} + } - this.fieldForm[element.field] = [] - } + this.fieldForm[element.field] = [] + } - contractForCount++ - if (contractForCount == handleFields.length) { - break + contractForCount++ + if (contractForCount == handleFields.length) { + break + } } } } @@ -501,7 +525,7 @@ export default { discount_rate: '' } this.fieldForm.money = '' - } else if (field.formType === 'business') { + } else if (field.form_type === 'business') { if (data.value.length > 0) { this.getBusinessProduct(data.value[0].business_id).then(resData => { const businessData = resData || {} @@ -513,11 +537,11 @@ export default { this.fieldForm.money = businessData.total_price || '' }).catch(() => {}) } - } else if (field.formType === 'product') { + } else if (field.form_type === 'product') { this.fieldForm.money = data.value.total_price || '' } this.$set(this.fieldForm, field.field, data.value) - this.$refs.crmForm.instance.validateField(field.field) + this.$refs.crmForm.validateField(field.field) }, /** diff --git a/src/views/crm/contract/Detail.vue b/src/views/crm/contract/Detail.vue index 0ec5880..2d59280 100644 --- a/src/views/crm/contract/Detail.vue +++ b/src/views/crm/contract/Detail.vue @@ -23,6 +23,8 @@ :head-details="headDetails" :id="id" :crm-type="crmType" + :page-list="pageList" + @pageChange="pageChange" @handle-click="deadHandleClick" @handle="detailHeadHandle" @close="hideView"> @@ -58,7 +60,7 @@ :id="id" :handle="activityHandle" :crm-type="crmType" - @on-handle="detailHeadHandle" /> + @handle="detailHeadHandle" />
diff --git a/src/views/crm/contract/index.vue b/src/views/crm/contract/index.vue index 9cfc754..e41c3ce 100644 --- a/src/views/crm/contract/index.vue +++ b/src/views/crm/contract/index.vue @@ -54,14 +54,21 @@ :width="item.width" sortable="custom" show-overflow-tooltip> - +
diff --git a/src/views/crm/customer/Create.vue b/src/views/crm/customer/Create.vue index 360e756..5456e84 100644 --- a/src/views/crm/customer/Create.vue +++ b/src/views/crm/customer/Create.vue @@ -5,27 +5,35 @@ @close="close" @save="saveClick"> - - - + + + + { - if (item.formType === 'mobile') { - item.defaultValue = this.phone + if (item.form_type === 'mobile') { + item.default_value = this.phone } }) } + const assistIds = this.getFormAssistIds(list) + const baseFields = [] const fieldList = [] const fieldRules = {} const fieldForm = {} - list.forEach(item => { - const temp = {} - temp.field = item.field - temp.formType = item.form_type - temp.fieldId = item.fieldId - temp.inputTips = item.input_tips - temp.name = item.name - temp.setting = item.setting - temp.value = item.value - const canEdit = this.getItemIsCanEdit(item, this.action.type) - // 是否能编辑权限 - if (canEdit) { - fieldRules[temp.field] = this.getRules(item) - } + list.forEach(children => { + const fields = [] + children.forEach(item => { + const temp = this.getFormItemDefaultProperty(item) + temp.show = !assistIds.includes(item.formAssistId) + + + const canEdit = this.getItemIsCanEdit(item, this.action.type) + // 是否能编辑权限 + if (temp.show && canEdit) { + fieldRules[temp.field] = this.getRules(item) + } - // 是否可编辑 - temp.disabled = !canEdit + // 是否可编辑 + temp.disabled = !canEdit - // 特殊字段允许多选 - this.getItemRadio(item, temp) + // 特殊字段允许多选 + this.getItemRadio(item, temp) - // 获取默认值 - fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) - fieldList.push(temp) + // 获取默认值 + if (temp.show) { + fieldForm[temp.field] = this.getItemValue(item, this.action.data, this.action.type) + } + fields.push(temp) + baseFields.push(item) + }) + fieldList.push(fields) }) - this.baseFields = list + this.baseFields = baseFields this.fieldList = fieldList this.fieldForm = fieldForm this.fieldRules = fieldRules - this.loading = false }) - .catch(() => { + .catch((e) => { this.loading = false }) }, @@ -196,7 +215,7 @@ export default { */ saveClick(createContacts = false) { this.loading = true - const crmForm = this.$refs.crmForm.instance + const crmForm = this.$refs.crmForm crmForm.validate(valid => { if (valid) { const params = this.getSubmiteParams(this.baseFields, this.fieldForm) @@ -220,7 +239,7 @@ export default { if (this.action.type == 'update') { // params.entity.customerId = this.action.id // params.entity.batchId = this.action.batchId - params.action_id = this.action.id + params.id = this.action.id } // 相关添加时候的多余提交信息 @@ -272,14 +291,25 @@ export default { /** * change */ - formChange(item, index, value, valueList) {}, + formChange(field, index, value, valueList) { + if ([ + 'select', + 'checkbox' + ].includes(field.form_type) && + field.remark === 'options_type' && + field.optionsData) { + const { fieldForm, fieldRules } = this.getFormContentByOptionsChange(this.fieldList, this.fieldForm) + this.fieldForm = fieldForm + this.fieldRules = fieldRules + } + }, /** * 地址change */ otherChange(data, field) { this.$set(this.fieldForm, field.field, data.value) - this.$refs.crmForm.instance.validateField(field.field) + this.$refs.crmForm.validateField(field.field) }, /** diff --git a/src/views/crm/customer/Detail.vue b/src/views/crm/customer/Detail.vue index 3641563..1f694eb 100644 --- a/src/views/crm/customer/Detail.vue +++ b/src/views/crm/customer/Detail.vue @@ -26,6 +26,8 @@ :pool_id="seasPoolId" :pool-auth="poolAuth" :crm-type="crmType" + :page-list="pageList" + @pageChange="pageChange" @handle="detailHeadHandle" @close="hideView"> diff --git a/src/views/workLog/components/LogItem.vue b/src/views/workLog/components/LogItem.vue index 5a6629d..d93300e 100644 --- a/src/views/workLog/components/LogItem.vue +++ b/src/views/workLog/components/LogItem.vue @@ -95,6 +95,13 @@