| @@ -5,10 +5,13 @@ VUE_APP_TITLE = 农燊高科 | |||
| ENV = 'development' | |||
| # 农燊高科/开发环境 | |||
| VUE_APP_BASE_API = '/dev-api' | |||
| VUE_APP_BASE_API = '/api' | |||
| # 路由懒加载 | |||
| VUE_CLI_BABEL_TRANSPILE_MODULES = true | |||
| port = 81 | |||
| API_HOST = 'http://localhost:8081' | |||
| # 登录账密凭据加密 | |||
| VUE_APP_ENABLE_SECRET=true | |||
| @@ -5,4 +5,4 @@ VUE_APP_TITLE = 农燊高科 | |||
| ENV = 'production' | |||
| # 农燊高科/生产环境 | |||
| VUE_APP_BASE_API = '/prod-api' | |||
| VUE_APP_BASE_API = '/api' | |||
| @@ -7,4 +7,4 @@ NODE_ENV = production | |||
| ENV = 'staging' | |||
| # 农燊高科/测试环境 | |||
| VUE_APP_BASE_API = '/stage-api' | |||
| VUE_APP_BASE_API = '/api' | |||
| @@ -21,3 +21,5 @@ selenium-debug.log | |||
| package-lock.json | |||
| yarn.lock | |||
| dist.* | |||
| @@ -0,0 +1,19 @@ | |||
| import request from '@/utils/request' | |||
| // 任务 | |||
| export function taskList(params) { | |||
| return request({ | |||
| url: '/agentcenter/task/taskList', | |||
| method: 'get', | |||
| params: params, | |||
| }) | |||
| } | |||
| // 待处理任务 | |||
| export function todoTaskList(params) { | |||
| return request({ | |||
| url: '/accounting/task/todoTaskList', | |||
| method: 'get', | |||
| params: params, | |||
| }) | |||
| } | |||
| @@ -55,7 +55,7 @@ export function logout() { | |||
| // 获取验证码 | |||
| export function getCodeImg() { | |||
| return request({ | |||
| url: '/gkyzm', | |||
| url: '/captchaImage', | |||
| headers: { | |||
| 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, | |||
| }) | |||
| } | |||
| @@ -88,7 +88,7 @@ export const constantRoutes = [ | |||
| } | |||
| ] | |||
| }, | |||
| //待处理 | |||
| /* //待处理 | |||
| { | |||
| path: '/todo', | |||
| component: () => import('@/views/taskAllocation/todo'), | |||
| @@ -105,7 +105,7 @@ export const constantRoutes = [ | |||
| path: '/abnormal', | |||
| component: () => import('@/views/abnormal/abnormal'), | |||
| hidden: true | |||
| }, | |||
| },*/ | |||
| //处理中 | |||
| { | |||
| path: '/processing', | |||
| @@ -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"> | |||
| <div class="select_address el-dropdown-link"> | |||
| <span class="sanjiao-right"></span> | |||
| <p>大足区</p> | |||
| <p>{{cityName}}</p> | |||
| </div> | |||
| <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> | |||
| </el-dropdown-item> | |||
| </el-dropdown-menu> | |||
| @@ -20,12 +20,12 @@ | |||
| <el-dropdown trigger="click" placement="bottom-start"> | |||
| <div class="select_address el-dropdown-link"> | |||
| <span class="sanjiao-right"></span> | |||
| <p>张家镇</p> | |||
| <p>{{townName}}</p> | |||
| </div> | |||
| <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> | |||
| </el-dropdown-item> | |||
| </el-dropdown-menu> | |||
| @@ -43,49 +43,61 @@ | |||
| <div class="left_main"> | |||
| <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"> | |||
| <div class="left_main_tt"> | |||
| <p>东沙镇</p> | |||
| <p>{{item.townName}}</p> | |||
| <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> | |||
| </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"> | |||
| <template slot-scope="props"> | |||
| <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 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> | |||
| </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> | |||
| </div> | |||
| </template> | |||
| </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 > | |||
| <template slot-scope="scope"> | |||
| <p class="backButton">未完成</p> | |||
| @@ -114,13 +126,15 @@ | |||
| class="pickerTime" | |||
| ref = "datePicker" | |||
| value-format="yyyy" | |||
| placeholder="选择年"> | |||
| placeholder="选择年" | |||
| @change="chooseMonth(1)" | |||
| > | |||
| </el-date-picker> | |||
| <span class="sanjiao-bottom" @click="reduceDate"></span> | |||
| </div> | |||
| <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> | |||
| @@ -132,71 +146,97 @@ | |||
| </template> | |||
| <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 { | |||
| name: "processing", | |||
| data() { | |||
| 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() { | |||
| this.getDeptTree(); | |||
| }, | |||
| methods:{ | |||
| addDate(){ | |||
| this.year = Number(this.year) + 1 ; | |||
| this.chooseMonth(1); | |||
| }, | |||
| reduceDate(){ | |||
| this.year = Number(this.year) - 1 ; | |||
| this.chooseMonth(1); | |||
| }, | |||
| selectionRange(){ | |||
| 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(){ | |||
| } | |||
| }, | |||
| 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> | |||
| @@ -6,12 +6,12 @@ | |||
| <el-dropdown trigger="click" placement="bottom-start"> | |||
| <div class="select_address el-dropdown-link"> | |||
| <span class="sanjiao-right"></span> | |||
| <p>大足区</p> | |||
| <p>{{cityName}}</p> | |||
| </div> | |||
| <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"> | |||
| <div class="selected" @click="chooseCity(item.orgCode)"> | |||
| <p>{{item.deptName}}</p> | |||
| </div> | |||
| </el-dropdown-item> | |||
| </el-dropdown-menu> | |||
| @@ -21,43 +21,43 @@ | |||
| <div class="el-dropdown-link select_main"> | |||
| <div class="select_address"> | |||
| <span class="sanjiao-right"></span> | |||
| <p>张家镇</p> | |||
| <p>{{townName}}</p> | |||
| </div> | |||
| <div class="select_address"> | |||
| <p class="select_time">2023.03.05</p> | |||
| </div> | |||
| </div> | |||
| <el-dropdown-menu slot="dropdown" style="width: 16vw;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"> | |||
| <div class="selected" @click="chooseTown(item.orgCode)"> | |||
| <p>{{item.deptName}}</p> | |||
| <p>2023.03.05</p> | |||
| </div> | |||
| </el-dropdown-item> | |||
| </el-dropdown-menu> | |||
| </el-dropdown> | |||
| <p class="todo_num">待处理合作社:<span>19</span>个</p> | |||
| <p class="todo_num">待处理合作社:<span>{{total}}</span>个</p> | |||
| </div> | |||
| <div class="main"> | |||
| <div class="left_main"> | |||
| <el-table :data="tableData" style="width: 100%;" :default-sort = "{prop: 'date', order: 'descending'}"> | |||
| <el-table-column prop="value1" label="村" /> | |||
| <el-table-column prop="value2" label="组织名称" show-overflow-tooltip /> | |||
| <el-table-column prop="value3" label="记账笔数" > | |||
| <el-table :data="list" style="width: 100%;"> | |||
| <el-table-column prop="orgName" label="村" /> | |||
| <el-table-column prop="bookName" label="组织名称" show-overflow-tooltip /> | |||
| <el-table-column prop="voucherCount" label="记账笔数" > | |||
| <template slot-scope="scope"> | |||
| 5 <span class="num">7</span> | |||
| {{scope.row.voucherCount}} <span class="num">7</span> | |||
| </template> | |||
| </el-table-column> | |||
| <el-table-column prop="value4" label="合同数量" /> | |||
| <el-table-column prop="value5" label="其他" /> | |||
| <el-table-column prop="value6" label="任务总数" /> | |||
| <el-table-column prop="value7" label="下发日期" /> | |||
| <el-table-column prop="value8" label="截止日期" sortable /> | |||
| <el-table-column prop="value9" label="操作"> | |||
| <el-table-column prop="contracCount" label="合同数量" /> | |||
| <el-table-column prop="otherCount" label="其他" /> | |||
| <el-table-column prop="allCount" label="任务总数" /> | |||
| <el-table-column prop="distriDate" label="下发日期" sortable /> | |||
| <el-table-column prop="endAt" label="截止日期" sortable /> | |||
| <el-table-column label="操作"> | |||
| <template slot-scope="scope"> | |||
| <el-button type="primary" size="mini" icon="el-icon-edit"></el-button> | |||
| </template> | |||
| @@ -80,13 +80,14 @@ | |||
| class="pickerTime" | |||
| ref = "datePicker" | |||
| value-format="yyyy" | |||
| placeholder="选择年"> | |||
| placeholder="选择年" | |||
| @change="chooseMonth(1)"> | |||
| </el-date-picker> | |||
| <span class="sanjiao-bottom" @click="reduceDate"></span> | |||
| </div> | |||
| <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> | |||
| @@ -98,71 +99,97 @@ | |||
| </template> | |||
| <script> | |||
| import {cityTree} from "@/api/misc/misc_dept"; | |||
| import {ENV} from "@/utils/env"; | |||
| import {taskList, todoTaskList} from "@/api/agentcenter/task"; | |||
| import {date_format} from "@/utils/date"; | |||
| export default { | |||
| name: "todo", | |||
| data() { | |||
| 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', | |||
| deptOptions: [], | |||
| cityCode: null, | |||
| townCode: null, | |||
| list: [], | |||
| total: 0, | |||
| year: date_format('%Y'), | |||
| month: date_format('%m'), | |||
| } | |||
| }, | |||
| created() { | |||
| this.getDeptTree(); | |||
| }, | |||
| methods:{ | |||
| addDate(){ | |||
| this.year = Number(this.year) + 1 ; | |||
| this.chooseMonth(1); | |||
| }, | |||
| reduceDate(){ | |||
| this.year = Number(this.year) - 1 ; | |||
| this.chooseMonth(1); | |||
| }, | |||
| selectionRange(){ | |||
| 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; | |||
| }); | |||
| }, | |||
| chooseCity(cmd) { | |||
| this.cityCode = cmd; | |||
| this.townCode = null; | |||
| }, | |||
| chooseTown(cmd) { | |||
| this.townCode = cmd; | |||
| this.getTaskList(); | |||
| }, | |||
| getTaskList() { | |||
| if(!this.townCode || !this.year || !this.month) | |||
| return; | |||
| todoTaskList({ | |||
| townCode: this.townCode, | |||
| orderYear: this.year, | |||
| orderMonth: this.month, | |||
| }).then((resp) => { | |||
| this.list = resp.rows; | |||
| this.total = resp.total; | |||
| }) | |||
| }, | |||
| isCurrentMonth(m) { | |||
| return parseInt(this.month) === m; | |||
| }, | |||
| chooseMonth(month) { | |||
| this.month = month >= 10 ? '' + month : ('0' + month); | |||
| this.getTaskList(); | |||
| }, | |||
| }, | |||
| 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> | |||
| @@ -35,7 +35,7 @@ module.exports = { | |||
| proxy: { | |||
| // detail: https://cli.vuejs.org/config/#devserver-proxy | |||
| [process.env.VUE_APP_BASE_API]: { | |||
| target: `http://localhost:8080`, | |||
| target: process.env.API_HOST || `http://localhost:8080`, | |||
| changeOrigin: true, | |||
| pathRewrite: { | |||
| ['^' + process.env.VUE_APP_BASE_API]: '' | |||