| @@ -5,10 +5,13 @@ VUE_APP_TITLE = 农燊高科 | |||||
| ENV = 'development' | ENV = 'development' | ||||
| # 农燊高科/开发环境 | # 农燊高科/开发环境 | ||||
| VUE_APP_BASE_API = '/dev-api' | |||||
| VUE_APP_BASE_API = '/api' | |||||
| # 路由懒加载 | # 路由懒加载 | ||||
| VUE_CLI_BABEL_TRANSPILE_MODULES = true | VUE_CLI_BABEL_TRANSPILE_MODULES = true | ||||
| port = 81 | |||||
| API_HOST = 'http://localhost:8081' | |||||
| # 登录账密凭据加密 | # 登录账密凭据加密 | ||||
| VUE_APP_ENABLE_SECRET=true | VUE_APP_ENABLE_SECRET=true | ||||
| @@ -5,4 +5,4 @@ VUE_APP_TITLE = 农燊高科 | |||||
| ENV = 'production' | ENV = 'production' | ||||
| # 农燊高科/生产环境 | # 农燊高科/生产环境 | ||||
| VUE_APP_BASE_API = '/prod-api' | |||||
| VUE_APP_BASE_API = '/api' | |||||
| @@ -7,4 +7,4 @@ NODE_ENV = production | |||||
| ENV = 'staging' | ENV = 'staging' | ||||
| # 农燊高科/测试环境 | # 农燊高科/测试环境 | ||||
| VUE_APP_BASE_API = '/stage-api' | |||||
| VUE_APP_BASE_API = '/api' | |||||
| @@ -21,3 +21,5 @@ selenium-debug.log | |||||
| package-lock.json | package-lock.json | ||||
| yarn.lock | yarn.lock | ||||
| dist.* | |||||
| @@ -0,0 +1,10 @@ | |||||
| import request from '@/utils/request' | |||||
| // 任务 | |||||
| export function taskList(params) { | |||||
| return request({ | |||||
| url: '/agentcenter/task/taskList', | |||||
| method: 'get', | |||||
| params: params, | |||||
| }) | |||||
| } | |||||
| @@ -55,7 +55,7 @@ export function logout() { | |||||
| // 获取验证码 | // 获取验证码 | ||||
| export function getCodeImg() { | export function getCodeImg() { | ||||
| return request({ | return request({ | ||||
| url: '/gkyzm', | |||||
| url: '/captchaImage', | |||||
| headers: { | headers: { | ||||
| isToken: false | isToken: false | ||||
| }, | }, | ||||
| @@ -0,0 +1,19 @@ | |||||
| import request from '@/utils/request' | |||||
| // 部门树 | |||||
| export function deptTree(params) { | |||||
| return request({ | |||||
| url: '/misc/dept/tree', | |||||
| method: 'get', | |||||
| params: params, | |||||
| }) | |||||
| } | |||||
| // 部门树(市级) | |||||
| export function cityTree(params) { | |||||
| return request({ | |||||
| url: '/misc/dept/cityTree', | |||||
| method: 'get', | |||||
| params: params, | |||||
| }) | |||||
| } | |||||
| @@ -0,0 +1,523 @@ | |||||
| /** | |||||
| * 支持的时间日期格式占位符: | |||||
| * 支持通用占位符和MySQL占位符(可以混合) | |||||
| * 格式化时以下都支持, 解析时不支持星期几 | |||||
| * 不支持时区, 保留z Z zz ZZ zzz ZZZ zzzz ZZZZ %z %Z | |||||
| * | |||||
| * 4位年: yyyy %Y | |||||
| * 2位年: yy %y | |||||
| * 2位月: MM %m | |||||
| * 数字月: M %c | |||||
| * 英文月: MMMM %M | |||||
| * 简写英文月: MMM %b | |||||
| * 2位日: dd %d | |||||
| * 数字日: d | |||||
| * 2位时(24): HH %H | |||||
| * 数字时(24): H %k | |||||
| * 2位时(12): hh %I %h | |||||
| * 数字时(12): h %l | |||||
| * 2位分: mm ii %i | |||||
| * 数字分: m i | |||||
| * 2位秒: ss %s %S | |||||
| * 数字秒: s | |||||
| * 3位毫秒: sss | |||||
| * 小写上下午(AM/PM): a p | |||||
| * 大写上下午(AM/PM): A P %p | |||||
| * 星期几(周一为1, 周日为7): u | |||||
| * 星期几(周日为0): %w | |||||
| * 英文星期几: dddd %W | |||||
| * 简写英文星期几: ddd %a | |||||
| * %: %% // MySQL特殊占位符% | |||||
| */ | |||||
| // Eng/lish | |||||
| const DATE_TIME_FORMAT_TYPE_IGNORE = 'ign'; | |||||
| const DATE_TIME_FORMAT_TYPE_EXPRESSION = 'exp'; | |||||
| const DATE_TIME_FORMAT_TYPE_RAW = 'raw'; | |||||
| const DAYS_SIMPLE = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; | |||||
| const DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; | |||||
| const MONTHS_SIMPLE = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; | |||||
| const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; | |||||
| function parseDateTimeFormatter(format) | |||||
| { | |||||
| let expect = function(target, str, range) { | |||||
| let i = 0; | |||||
| if(!range) | |||||
| range = 1; | |||||
| if(!Array.isArray(range)) | |||||
| { | |||||
| let arr = []; | |||||
| for(let m = 1; m <= range; m++) | |||||
| arr.push(m); | |||||
| range = arr; | |||||
| } | |||||
| let res = 0; | |||||
| let max = Math.max(...range); | |||||
| let min = Math.min(...range); | |||||
| while(i < str.length) | |||||
| { | |||||
| let ch = str[i++]; | |||||
| if(target.indexOf(ch) === -1) | |||||
| break; | |||||
| if(range.indexOf(i) === -1) | |||||
| { | |||||
| if(i >= max) | |||||
| break; | |||||
| } | |||||
| if(range.indexOf(i) !== -1) | |||||
| res = i; | |||||
| } | |||||
| if(res > 0) | |||||
| { | |||||
| return res; | |||||
| } | |||||
| return false; | |||||
| }; | |||||
| let i = 0; | |||||
| let arr = []; | |||||
| while(i < format.length) | |||||
| { | |||||
| let ch = format[i]; | |||||
| let n = false; | |||||
| switch(ch) | |||||
| { | |||||
| case 'y': | |||||
| n = expect('y', format.substr(i), [2, 4]); | |||||
| break; | |||||
| case 'M': | |||||
| n = expect('M', format.substr(i), 4); | |||||
| break; | |||||
| case 'd': | |||||
| n = expect('d', format.substr(i), 4); | |||||
| break; | |||||
| case 'H': | |||||
| case 'h': | |||||
| n = expect(ch, format.substr(i), 2); | |||||
| break; | |||||
| case 'm': | |||||
| case 'i': | |||||
| n = expect(ch, format.substr(i), 2); | |||||
| break; | |||||
| case 's': | |||||
| n = expect('s', format.substr(i), 3); | |||||
| break; | |||||
| case 'a': | |||||
| case 'p': | |||||
| case 'A': | |||||
| case 'P': | |||||
| case 'u': | |||||
| n = expect(ch, format.substr(i)); | |||||
| break; | |||||
| case 'z': | |||||
| case 'Z': | |||||
| n = expect(ch, format.substr(i), 4); | |||||
| break; | |||||
| case '%': | |||||
| n = expect('YmdHisSyecklIh%zZ', format.substr(i + 1)); | |||||
| if(n === 1) | |||||
| n++; | |||||
| break; | |||||
| default: | |||||
| arr.push({str: ch, type: DATE_TIME_FORMAT_TYPE_RAW}); | |||||
| i++; | |||||
| continue; | |||||
| } | |||||
| if(n) | |||||
| { | |||||
| let s = format.substr(i, n); | |||||
| let ignore = ['z', 'zz', 'zzz', 'zzzz', 'Z', 'ZZ', 'ZZZ', 'ZZZZ', '%z', '%Z'].indexOf(s) !== -1; | |||||
| arr.push({str: s, type: ignore ? DATE_TIME_FORMAT_TYPE_IGNORE : DATE_TIME_FORMAT_TYPE_EXPRESSION}); | |||||
| i += n; | |||||
| } | |||||
| else | |||||
| { | |||||
| arr.push({str: format.substr(i), type: DATE_TIME_FORMAT_TYPE_RAW}); | |||||
| break; | |||||
| } | |||||
| } | |||||
| return arr; | |||||
| } | |||||
| /** | |||||
| * 格式化日期时间 | |||||
| * @param date 日期时间 Date对象/时间戳 默认当前日期时间 | |||||
| * @param format 格式化字符串 字符串 默认 yyyy-MM-dd HH:mm:ss | |||||
| * @returns {string} 日期时间格式化后的字符串 | |||||
| */ | |||||
| export function date_format(date, format) { | |||||
| if(arguments.length === 1) | |||||
| { | |||||
| format = date; | |||||
| date = null; | |||||
| } | |||||
| if (!date) | |||||
| date = new Date; | |||||
| else if(!date instanceof Date) | |||||
| date = new Date(date); | |||||
| format = format || 'yyyy-MM-dd HH:mm:ss'; | |||||
| let numpad = function(num, limit) { | |||||
| limit = limit || 10; | |||||
| if(num >= limit) | |||||
| return num; | |||||
| let res = num; | |||||
| while(num < limit && limit >= 10) | |||||
| { | |||||
| res = '0' + res; | |||||
| limit /= 10; | |||||
| } | |||||
| return res; | |||||
| } | |||||
| const _y = date.getFullYear(); | |||||
| const _m = date.getMonth() + 1; | |||||
| const _d = date.getDate(); | |||||
| const _h = date.getHours(); | |||||
| const _i = date.getMinutes(); | |||||
| const _s = date.getSeconds(); | |||||
| const _a = date.getDay(); | |||||
| const _z = date.getMilliseconds(); | |||||
| // General style | |||||
| let Options = { | |||||
| yyyy: _y, | |||||
| MM: numpad(_m), | |||||
| dd: numpad(_d), | |||||
| HH: numpad(_h), | |||||
| mm: numpad(_i), | |||||
| ss: numpad(_s), | |||||
| sss: numpad(_z, 100), | |||||
| yy: _y % 100, | |||||
| M: _m, | |||||
| d: _d, | |||||
| H: _h, | |||||
| m: _i, | |||||
| s: _s, | |||||
| hh: numpad((_h % 12) || 12), | |||||
| h: (_h % 12) || 12, | |||||
| // Qt style | |||||
| ddd: DAYS_SIMPLE[_a - 1], | |||||
| dddd: DAYS[_a - 1], | |||||
| MMM: MONTHS_SIMPLE[_m - 1], | |||||
| MMMM: MONTHS[_m - 1], | |||||
| // Java style | |||||
| a: _h > 12 ? 'pm' : 'am', | |||||
| A: _h > 12 ? 'PM' : 'AM', | |||||
| u: _a, | |||||
| }; | |||||
| Options['p'] = Options.a; | |||||
| Options['P'] = Options.A; | |||||
| // PHP style | |||||
| Options['ii'] = Options.mm; | |||||
| Options['i'] = Options.m; | |||||
| // MySQL style | |||||
| Options['%Y'] = Options.yyyy; | |||||
| Options['%m'] = Options.MM; | |||||
| Options['%d'] = Options.dd; | |||||
| Options['%H'] = Options.HH; | |||||
| Options['%i'] = Options.mm; | |||||
| Options['%s'] = Options.ss; | |||||
| Options['%S'] = Options.ss; | |||||
| Options['%y'] = Options.yy; | |||||
| Options['%e'] = Options.d; | |||||
| Options['%c'] = Options.M; | |||||
| Options['%k'] = Options.H; | |||||
| Options['%l'] = Options.h; | |||||
| Options['%I'] = Options.hh; | |||||
| Options['%h'] = Options.hh; | |||||
| Options['%p'] = Options.A; | |||||
| Options['%w'] = Options.u - 1; | |||||
| Options['%a'] = Options.ddd; | |||||
| Options['%W'] = Options.dddd; | |||||
| Options['%M'] = Options.MMMM; | |||||
| Options['%b'] = Options.MMM; | |||||
| Options['%%'] = '%'; | |||||
| let arr = parseDateTimeFormatter(format); | |||||
| //console.log(arr); | |||||
| arr = arr.filter((x) => x.type !== DATE_TIME_FORMAT_TYPE_IGNORE).map((x) => { | |||||
| return x.type === DATE_TIME_FORMAT_TYPE_EXPRESSION ? (Options[x.str] || x.str) : x.str; | |||||
| }) | |||||
| //console.log(format, '|', arr.join('')); | |||||
| return arr.join(''); | |||||
| } | |||||
| /** | |||||
| * 解析日期时间 | |||||
| * @param date 日期时间字符串 字符串 | |||||
| * @param format 格式化字符串 字符串 默认 yyyy-MM-dd HH:mm:ss | |||||
| * @param initNow 缺省部分是否使用当前日期时间部分代替 bool 默认不使用当前 | |||||
| * @returns {Date} 解析日期时间出来的Date对象 | |||||
| */ | |||||
| export function strtotime(date, format, initNow) | |||||
| { | |||||
| if (!date) | |||||
| return null; | |||||
| let expect = function(target, str) { | |||||
| if(Array.isArray(target)) | |||||
| { | |||||
| let res = 0; | |||||
| if(typeof(target[0]) === 'number') | |||||
| { | |||||
| for(let t of target) | |||||
| { | |||||
| if(str.length >= t) | |||||
| { | |||||
| if(t > res && new RegExp(`^\\d{${t}}`).test(str)) | |||||
| res = t; | |||||
| } | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| for(let t of target) | |||||
| { | |||||
| if(str.length < t.length) | |||||
| continue; | |||||
| if(str.startsWith(t)) | |||||
| { | |||||
| res = t.length; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| return res; | |||||
| } | |||||
| else | |||||
| { | |||||
| if(typeof(target) === 'number') | |||||
| { | |||||
| if(str.length < target) | |||||
| return 0; | |||||
| if(!new RegExp(`^\\d{${target}}`).test(str)) | |||||
| return null; | |||||
| return target; | |||||
| } | |||||
| else if(typeof(target) === 'object') | |||||
| { | |||||
| let res = 0; | |||||
| let min = target.min || 0; | |||||
| let max = target.max; | |||||
| for(let m = min; m <= max; m++) | |||||
| { | |||||
| let t = '' + m; | |||||
| if(str.length >= t.length) | |||||
| { | |||||
| if(str.startsWith(t)) | |||||
| res = t.length; | |||||
| } | |||||
| } | |||||
| return res; | |||||
| } | |||||
| else | |||||
| { | |||||
| if(str.length < target.length) | |||||
| return 0; | |||||
| if(!str.startsWith(target)) | |||||
| return 0; | |||||
| return target.length; | |||||
| } | |||||
| } | |||||
| }; | |||||
| format = format || 'yyyy-MM-dd HH:mm:ss'; | |||||
| let arr = parseDateTimeFormatter(format); | |||||
| let i = 0; | |||||
| let _y = undefined; | |||||
| let _m = undefined; | |||||
| let _d = undefined; | |||||
| let _h = undefined; | |||||
| let _i = undefined; | |||||
| let _s = undefined; | |||||
| let _z = undefined; | |||||
| let _h_12 = undefined; | |||||
| let _ap = undefined; | |||||
| let get_token = function(str, target) { | |||||
| let r = expect(target, date.substr(i)); | |||||
| if(r <= 0) | |||||
| return null; | |||||
| let nstr = date.substr(i, r); | |||||
| i += r; | |||||
| return nstr; | |||||
| }; | |||||
| //console.log(arr); | |||||
| for(let part of arr) | |||||
| { | |||||
| if(part.type === DATE_TIME_FORMAT_TYPE_RAW || part.type === DATE_TIME_FORMAT_TYPE_IGNORE) | |||||
| { | |||||
| let r = expect(part.str, date.substr(i)); | |||||
| if(!r) | |||||
| return null; | |||||
| i += r; | |||||
| } | |||||
| else | |||||
| { | |||||
| let p = null; | |||||
| switch(part.str) | |||||
| { | |||||
| case 'yyyy': | |||||
| case '%Y': | |||||
| p = get_token(part.str, 4); | |||||
| if(p) | |||||
| _y = parseInt(p); | |||||
| break; | |||||
| case 'yy': | |||||
| case '%y': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _y = Math.floor((date.getFullYear()) / 100) * 100 + parseInt(p); | |||||
| break; | |||||
| case 'MM': | |||||
| case '%m': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _m = parseInt(p); | |||||
| break; | |||||
| case 'M': | |||||
| case '%c': | |||||
| p = get_token(part.str, {min: 1, max: 12}); | |||||
| if(p) | |||||
| _m = parseInt(p); | |||||
| break; | |||||
| case 'MMMM': | |||||
| case '%M': | |||||
| p = get_token(part.str, MONTHS); | |||||
| if(p) | |||||
| _m = MONTHS.indexOf(p) + 1; | |||||
| break; | |||||
| case 'MMM': | |||||
| case '%b': | |||||
| p = get_token(part.str, MONTHS_SIMPLE); | |||||
| if(p) | |||||
| _m = MONTHS_SIMPLE.indexOf(p) + 1; | |||||
| break; | |||||
| case 'dd': | |||||
| case '%d': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _d = parseInt(p); | |||||
| break; | |||||
| case 'd': | |||||
| case '%e': | |||||
| p = get_token(part.str, {min: 1, max: 31}); | |||||
| if(p) | |||||
| _d = parseInt(p); | |||||
| break; | |||||
| case 'HH': | |||||
| case '%H': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _h = parseInt(p); | |||||
| break; | |||||
| case 'H': | |||||
| case '%k': | |||||
| p = get_token(part.str, {max: 23}); | |||||
| if(p) | |||||
| _h = parseInt(p); | |||||
| break; | |||||
| case 'hh': | |||||
| case '%I': | |||||
| case '%h': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _h_12 = parseInt(p); | |||||
| break; | |||||
| case 'h': | |||||
| case '%l': | |||||
| p = get_token(part.str, {max: 12}); | |||||
| if(p) | |||||
| _h_12 = parseInt(p); | |||||
| break; | |||||
| case 'mm': | |||||
| case 'ii': | |||||
| case '%i': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _i = parseInt(p); | |||||
| break; | |||||
| case 'm': | |||||
| case 'i': | |||||
| p = get_token(part.str, {max: 59}); | |||||
| if(p) | |||||
| _i = parseInt(p); | |||||
| break; | |||||
| case 'ss': | |||||
| case '%s': | |||||
| case '%S': | |||||
| p = get_token(part.str, 2); | |||||
| if(p) | |||||
| _s = parseInt(p); | |||||
| break; | |||||
| case 's': | |||||
| p = get_token(part.str, {max: 59}); | |||||
| if(p) | |||||
| _s = parseInt(p); | |||||
| break; | |||||
| case 'sss': | |||||
| p = get_token(part.str, {max: 999}); | |||||
| if(p) | |||||
| _z = parseInt(p); | |||||
| break; | |||||
| case 'A': | |||||
| case 'p': { | |||||
| const AP = ['AM', 'PM']; | |||||
| p = get_token(part.str, AP); | |||||
| if(p) | |||||
| _ap = p.toLowerCase(); | |||||
| } | |||||
| break; | |||||
| case 'a': | |||||
| case 'P': | |||||
| case '%p':{ | |||||
| const AP = ['am', 'pm']; | |||||
| p = get_token(part.str, AP); | |||||
| if(p) | |||||
| _ap = p; | |||||
| } | |||||
| break; | |||||
| case 'u': | |||||
| case '%w': | |||||
| case '%W': | |||||
| case 'dddd': | |||||
| case 'ddd': | |||||
| throw new Error('不支持星期几解析: ' + part.str); // not ignore and throw | |||||
| //break; | |||||
| case '%%': | |||||
| //TODO: ignore 最好不解析出来 | |||||
| break; | |||||
| default: | |||||
| throw new Error('不支持的格式解析: ' + part.str); | |||||
| break; | |||||
| } | |||||
| if(!p) | |||||
| return null; | |||||
| } | |||||
| } | |||||
| if(_h_12 !== undefined && _ap !== undefined) | |||||
| { | |||||
| _h = (_ap === 'pm' ? _h_12 + 12 : _h_12) % 24; | |||||
| } | |||||
| let res = new Date; | |||||
| //console.log('1111111111',_y, _m, _d, _h, _i, _s, _z); | |||||
| if(_y === undefined) _y = initNow ? res.getFullYear() : 0; | |||||
| if(_m === undefined) _m = initNow ? res.getMonth() + 1 : 1; | |||||
| if(_d === undefined) _d = initNow ? res.getDate() : 1; | |||||
| if(_h === undefined) _h = initNow ? res.getHours() : 0; | |||||
| if(_i === undefined) _i = initNow ? res.getMinutes() : 0; | |||||
| if(_s === undefined) _s = initNow ? res.getSeconds() : 0; | |||||
| if(_z === undefined) _z = initNow ? res.getMilliseconds() : 0; | |||||
| //console.log('2222222222',_y, _m, _d, _h, _i, _s, _z); | |||||
| res.setFullYear(_y, _m - 1, _d); | |||||
| res.setHours(_h, _i, _s, _z); | |||||
| return res; | |||||
| } | |||||
| /** | |||||
| * 转换日期时间格式 | |||||
| * @param dateStr 源日期时间字符串 字符串 | |||||
| * @param sourceFormat 源格式化字符串 字符串 默认 yyyy-MM-dd HH:mm:ss | |||||
| * @param targetFormat 目标格式化字符串 字符串 默认 yyyy-MM-dd HH:mm:ss | |||||
| * @param initNow 缺省部分是否使用当前日期时间部分代替 bool 默认不使用当前 | |||||
| * @returns {string} 重新格式化的日期时间出字符串 | |||||
| */ | |||||
| export function date(dateStr, sourceFormat, targetFormat, initNow) | |||||
| { | |||||
| return date_format(strtotime(dateStr, sourceFormat, initNow), targetFormat); | |||||
| } | |||||
| @@ -0,0 +1,7 @@ | |||||
| import store from '../store' | |||||
| export const ENV = { | |||||
| UserDeptId() { | |||||
| return store.state.user.deptId; | |||||
| }, | |||||
| } | |||||
| @@ -6,12 +6,12 @@ | |||||
| <el-dropdown trigger="click" placement="bottom-start"> | <el-dropdown trigger="click" placement="bottom-start"> | ||||
| <div class="select_address el-dropdown-link"> | <div class="select_address el-dropdown-link"> | ||||
| <span class="sanjiao-right"></span> | <span class="sanjiao-right"></span> | ||||
| <p>大足区</p> | |||||
| <p>{{cityName}}</p> | |||||
| </div> | </div> | ||||
| <el-dropdown-menu slot="dropdown" style="width: 8vw;text-align: center;"> | <el-dropdown-menu slot="dropdown" style="width: 8vw;text-align: center;"> | ||||
| <el-dropdown-item v-for="(item,index) in 5"> | |||||
| <div class="selected"> | |||||
| <p>张家镇</p> | |||||
| <el-dropdown-item v-for="(item,index) in deptOptions" :command="item.orgCode"> | |||||
| <div class="selected" @click="chooseCity(item.orgCode)"> | |||||
| <p>{{item.deptName}}</p> | |||||
| </div> | </div> | ||||
| </el-dropdown-item> | </el-dropdown-item> | ||||
| </el-dropdown-menu> | </el-dropdown-menu> | ||||
| @@ -20,12 +20,12 @@ | |||||
| <el-dropdown trigger="click" placement="bottom-start"> | <el-dropdown trigger="click" placement="bottom-start"> | ||||
| <div class="select_address el-dropdown-link"> | <div class="select_address el-dropdown-link"> | ||||
| <span class="sanjiao-right"></span> | <span class="sanjiao-right"></span> | ||||
| <p>张家镇</p> | |||||
| <p>{{townName}}</p> | |||||
| </div> | </div> | ||||
| <el-dropdown-menu slot="dropdown" style="width: 8vw;text-align: center;"> | <el-dropdown-menu slot="dropdown" style="width: 8vw;text-align: center;"> | ||||
| <el-dropdown-item v-for="(item,index) in 5"> | |||||
| <div class="selected"> | |||||
| <p>张家镇</p> | |||||
| <el-dropdown-item v-for="(item,index) in townList" :command="item.orgCode"> | |||||
| <div class="selected" @click="chooseTown(item.orgCode)"> | |||||
| <p>{{item.deptName}}</p> | |||||
| </div> | </div> | ||||
| </el-dropdown-item> | </el-dropdown-item> | ||||
| </el-dropdown-menu> | </el-dropdown-menu> | ||||
| @@ -43,49 +43,61 @@ | |||||
| <div class="left_main"> | <div class="left_main"> | ||||
| <el-collapse accordion> | <el-collapse accordion> | ||||
| <el-collapse-item v-for="(item,index) in 5" :key="index"> | |||||
| <el-collapse-item v-for="(item,index) in list" :key="index"> | |||||
| <template slot="title"> | <template slot="title"> | ||||
| <div class="left_main_tt"> | <div class="left_main_tt"> | ||||
| <p>东沙镇</p> | |||||
| <p>{{item.townName}}</p> | |||||
| <div class="tt_label"> | <div class="tt_label"> | ||||
| <p>异常:1</p> | |||||
| <p>村庄处理进度:15/20</p> | |||||
| <p>村庄审核进度:15/20</p> | |||||
| <p>异常:{{item.numExcept}}</p> | |||||
| <p>村庄处理进度:{{item.numProcessFinish}}/{{item.num}}</p> | |||||
| <p>村庄审核进度:{{item.numApprovalFinish}}/{{item.num}}</p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| <el-table :data="tableData" style="width: 100%;" :default-sort = "{prop: 'date', order: 'descending'}"> | |||||
| <el-table :data="item.villageList" style="width: 100%;" :default-sort = "{prop: 'date', order: 'descending'}"> | |||||
| <el-table-column type="expand"> | <el-table-column type="expand"> | ||||
| <template slot-scope="props"> | <template slot-scope="props"> | ||||
| <div class="openTable"> | <div class="openTable"> | ||||
| <el-row v-for="(item,index) in 5" :key="index"> | |||||
| <el-col span="9"> | |||||
| <el-row v-for="(task,index) in props.row.taskList" :key="index"> | |||||
| <el-col :span="9"> | |||||
| <div class="tab_main"> | <div class="tab_main"> | ||||
| <div v-if="index == 0"><span>未处理</span><span>未审核</span></div> | |||||
| <div v-if="index == 1"><span class="tab_green">已处理</span><span class="tab_green">已审核</span></div> | |||||
| <div v-if="index == 2"><span class="tab_red">异常:1</span><span>未审核</span></div> | |||||
| 康师傅合作社 | |||||
| <span v-if="task.agentStatus === '1'">未处理</span><span v-if="!task.isAudit">未审核</span> | |||||
| <span v-if="task.agentStatus !== '1'" class="tab_green">已处理</span><span class="tab_green" v-if="task.isAudit">已审核</span> | |||||
| <span class="tab_red">异常:1</span> | |||||
| {{task.bookName}} | |||||
| </div> | </div> | ||||
| </el-col> | </el-col> | ||||
| <el-col span="2">记账:3</el-col> | |||||
| <el-col span="2">合同:3</el-col> | |||||
| <el-col span="2">其他:3</el-col> | |||||
| <el-col span="9" style="text-align: right"><el-button type="primary" size="mini">进入账套</el-button></el-col> | |||||
| <el-col :span="2">记账:{{task.voucherCount}}</el-col> | |||||
| <el-col :span="2">合同:{{task.contracCount}}</el-col> | |||||
| <el-col :span="2">其他:{{task.allCount - task.voucherCount - task.contracCount}}</el-col> | |||||
| <el-col :span="9" style="text-align: right"><el-button type="primary" size="mini">进入账套</el-button></el-col> | |||||
| </el-row> | </el-row> | ||||
| </div> | </div> | ||||
| </template> | </template> | ||||
| </el-table-column> | </el-table-column> | ||||
| <el-table-column prop="value1" label="村" show-overflow-tooltip /> | |||||
| <el-table-column prop="value2" label="合作社" show-overflow-tooltip /> | |||||
| <el-table-column prop="value3" label="处理进度" show-overflow-tooltip /> | |||||
| <el-table-column prop="value4" label="异常任务" show-overflow-tooltip /> | |||||
| <el-table-column prop="value5" label="审核进度" show-overflow-tooltip /> | |||||
| <el-table-column prop="value6" label="会计" show-overflow-tooltip /> | |||||
| <el-table-column prop="value7" label="下发日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="value7" label="截止日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="value7" label="记账完成日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="orgName" label="村" show-overflow-tooltip /> | |||||
| <el-table-column prop="" label="合作社" show-overflow-tooltip /> | |||||
| <el-table-column label="处理进度" show-overflow-tooltip > | |||||
| <template slot-scope="scope"> | |||||
| {{scope.row.numProcessFinish}}/{{scope.row.num}} | |||||
| </template> | |||||
| </el-table-column> | |||||
| <el-table-column prop="numExcept" label="异常任务" show-overflow-tooltip > | |||||
| <template slot-scope="scope"> | |||||
| {{scope.row.numExcept || '无'}} | |||||
| </template> | |||||
| </el-table-column> | |||||
| <el-table-column label="审核进度" show-overflow-tooltip > | |||||
| <template slot-scope="scope"> | |||||
| {{scope.row.numApprovalFinish}}/{{scope.row.num}} | |||||
| </template> | |||||
| </el-table-column> | |||||
| <el-table-column prop="handleNick" label="会计" show-overflow-tooltip /> | |||||
| <el-table-column prop="distriDate" label="下发日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="endAt" label="截止日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="handleDate" label="记账完成日期" show-overflow-tooltip /> | |||||
| <el-table-column prop="value8" label="是否审批完成" show-overflow-tooltip > | <el-table-column prop="value8" label="是否审批完成" show-overflow-tooltip > | ||||
| <template slot-scope="scope"> | <template slot-scope="scope"> | ||||
| <p class="backButton">未完成</p> | <p class="backButton">未完成</p> | ||||
| @@ -114,13 +126,15 @@ | |||||
| class="pickerTime" | class="pickerTime" | ||||
| ref = "datePicker" | ref = "datePicker" | ||||
| value-format="yyyy" | value-format="yyyy" | ||||
| placeholder="选择年"> | |||||
| placeholder="选择年" | |||||
| @change="chooseMonth(1)" | |||||
| > | |||||
| </el-date-picker> | </el-date-picker> | ||||
| <span class="sanjiao-bottom" @click="reduceDate"></span> | <span class="sanjiao-bottom" @click="reduceDate"></span> | ||||
| </div> | </div> | ||||
| <div class="month_main"> | <div class="month_main"> | ||||
| <p v-for="(item,index) in 12" :class="{'active':index==3}">{{index+1}}月<i v-if="index==3"></i></p> | |||||
| <p v-for="(item,index) in 12" @click="chooseMonth(index + 1)" :class="{'active': isCurrentMonth(index + 1)}">{{index+1}}月<i v-if="isCurrentMonth(index + 1)"></i></p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -132,71 +146,97 @@ | |||||
| </template> | </template> | ||||
| <script> | <script> | ||||
| import {cityTree, deptTree} from "@/api/misc/misc_dept"; | |||||
| import {ENV} from "@/utils/env"; | |||||
| import {date_format} from "@/utils/date"; | |||||
| import {taskList} from "@/api/agentcenter/task"; | |||||
| export default { | export default { | ||||
| name: "processing", | name: "processing", | ||||
| data() { | data() { | ||||
| return { | return { | ||||
| tableData: [{ | |||||
| value1: '当当村', | |||||
| value2: '玩玩玩玩玩玩玩玩合作社玩玩玩玩玩玩玩玩合作社', | |||||
| value3: '8', | |||||
| value4: '5', | |||||
| value5: '5', | |||||
| value6: '18', | |||||
| value7: '2023.03.05', | |||||
| value8: '2023.03.06', | |||||
| value9: '111' | |||||
| }, { | |||||
| value1: '当当村', | |||||
| value2: '玩玩玩玩玩玩玩玩合作社', | |||||
| value3: '8', | |||||
| value4: '5', | |||||
| value5: '5', | |||||
| value6: '18', | |||||
| value7: '2023.03.05', | |||||
| value8: '2023.03.06', | |||||
| value9: '111' | |||||
| }, { | |||||
| value1: '当当村', | |||||
| value2: '玩玩玩玩玩玩玩玩合作社', | |||||
| value3: '8', | |||||
| value4: '5', | |||||
| value5: '5', | |||||
| value6: '18', | |||||
| value7: '2023.03.05', | |||||
| value8: '2023.03.06', | |||||
| value9: '111' | |||||
| }, { | |||||
| value1: '当当村', | |||||
| value2: '玩玩玩玩玩玩玩玩合作社', | |||||
| value3: '8', | |||||
| value4: '5', | |||||
| value5: '5', | |||||
| value6: '18', | |||||
| value7: '2023.03.05', | |||||
| value8: '2023.03.06', | |||||
| value9: '111' | |||||
| }], | |||||
| year:'2023', | |||||
| year: date_format('%Y'), | |||||
| cityCode: null, | |||||
| townCode: null, | |||||
| deptOptions: [], | |||||
| month: date_format('%m'), | |||||
| list: [], | |||||
| total: 0, | |||||
| } | } | ||||
| }, | }, | ||||
| created() { | created() { | ||||
| this.getDeptTree(); | |||||
| }, | }, | ||||
| methods:{ | methods:{ | ||||
| addDate(){ | addDate(){ | ||||
| this.year = Number(this.year) + 1 ; | this.year = Number(this.year) + 1 ; | ||||
| this.chooseMonth(1); | |||||
| }, | }, | ||||
| reduceDate(){ | reduceDate(){ | ||||
| this.year = Number(this.year) - 1 ; | this.year = Number(this.year) - 1 ; | ||||
| this.chooseMonth(1); | |||||
| }, | }, | ||||
| selectionRange(){ | selectionRange(){ | ||||
| this.$refs.datePicker.focus(); | this.$refs.datePicker.focus(); | ||||
| }, | }, | ||||
| getDeptTree() { | |||||
| cityTree({rootId: ENV.UserDeptId()}).then((resp) => { | |||||
| this.deptOptions = resp.data; | |||||
| if(this.deptOptions.length) | |||||
| this.cityCode = this.deptOptions[0].orgCode; | |||||
| }); | |||||
| }, | |||||
| getTaskList() { | |||||
| if(!this.townCode || !this.year || !this.month) | |||||
| return; | |||||
| taskList({ | |||||
| townCode: this.townCode, | |||||
| orderYear: this.year, | |||||
| orderMonth: this.month, | |||||
| }).then((resp) => { | |||||
| this.list = resp.rows; | |||||
| this.total = resp.total; | |||||
| }) | |||||
| }, | |||||
| chooseCity(cmd) { | |||||
| this.cityCode = cmd; | |||||
| this.townCode = null; | |||||
| }, | |||||
| chooseTown(cmd) { | |||||
| this.townCode = cmd; | |||||
| this.getTaskList(); | |||||
| }, | |||||
| isCurrentMonth(m) { | |||||
| return parseInt(this.month) === m; | |||||
| }, | |||||
| chooseMonth(month) { | |||||
| this.month = month >= 10 ? '' + month : ('0' + month); | |||||
| this.getTaskList(); | |||||
| }, | |||||
| }, | }, | ||||
| mounted(){ | mounted(){ | ||||
| } | |||||
| }, | |||||
| computed: { | |||||
| cityName() { | |||||
| if(!this.deptOptions.length) | |||||
| return ''; | |||||
| let dept = this.deptOptions.find((x) => x.orgCode === this.cityCode); | |||||
| return dept ? dept.deptName : ''; | |||||
| }, | |||||
| townList() { | |||||
| if(!this.deptOptions.length) | |||||
| return []; | |||||
| let dept = this.deptOptions.find((x) => x.orgCode === this.cityCode); | |||||
| return dept ? dept.children || [] : []; | |||||
| }, | |||||
| townName() { | |||||
| if(!this.townList.length) | |||||
| return ''; | |||||
| let dept = this.townList.find((x) => x.orgCode === this.townCode); | |||||
| return dept ? dept.deptName : ''; | |||||
| }, | |||||
| }, | |||||
| } | } | ||||
| </script> | </script> | ||||
| @@ -35,7 +35,7 @@ module.exports = { | |||||
| proxy: { | proxy: { | ||||
| // detail: https://cli.vuejs.org/config/#devserver-proxy | // detail: https://cli.vuejs.org/config/#devserver-proxy | ||||
| [process.env.VUE_APP_BASE_API]: { | [process.env.VUE_APP_BASE_API]: { | ||||
| target: `http://localhost:8080`, | |||||
| target: process.env.API_HOST || `http://localhost:8080`, | |||||
| changeOrigin: true, | changeOrigin: true, | ||||
| pathRewrite: { | pathRewrite: { | ||||
| ['^' + process.env.VUE_APP_BASE_API]: '' | ['^' + process.env.VUE_APP_BASE_API]: '' | ||||