Commit f9b74497 by zhaoxiqing

Merge branch 'bpo-admin-department' of http://gitlab.gongsibao.com/jiangyong/zhichan into bpo-admin

parents 70562c90 00ded4f2
......@@ -166,9 +166,9 @@ class ChannelApi {
if(!queryobj.channel_id){
return system.getResultFail(-1, "channel_id不能为空");
}
if(!queryobj.origin_id){
return system.getResultFail(-1, "origin_id不能为空");
}
// if(!queryobj.origin_id){
// return system.getResultFail(-1, "origin_id不能为空");
// }
if(!queryobj.merchant_name){
return system.getResultFail(-1, "merchant_name不能为空");
}
......@@ -192,6 +192,7 @@ class ChannelApi {
return system.getResultFail(-1, "origin_merchant_name不能为空");
}
}
queryobj.origin_id = 10000;
return await this.channelService.merchantSaves(queryobj);
} catch (e) {
console.log(e);
......
......@@ -2,13 +2,101 @@ var system = require("../../system")
var moment = require("moment");
const md5 = require("MD5");
const logCtl = system.getObject("web.oplogCtl");
const syncDays = Number(5);
class EcontractApi {
constructor() {
this.esettleSve = system.getObject("service.esettleSve");
this.restClient = system.getObject("util.restClient");
this.redisClient = system.getObject("util.redisClient");
this.outTradeNoKey = 'bpo_outtradeno';
}
async syncUserDepartment(pobj) {
let map1 = await this.etemplatebusiSve.findOwnerBusiIdMap(1) || {};
let map2 = await this.etemplatebusiSve.findOwnerBusiIdMap(2) || {};
let keys1 = Object.keys(map1);
let keys2 = Object.keys(map2);
let keys3 = keys1.concat(keys2);
let userMap = await this.userSve.findMapByIds(keys3);
let departmentDic = await this.departmentSve.mapDict();
await this.updateStatDepartment(map1, userMap, departmentDic);
await this.updateStatDepartment(map2, userMap, departmentDic);
return system.getResult2(1);
}
async updateStatDepartment(map, userMap, departmentDic) {
for (let k in map) {
let busiIds = map[k] || [];
if (busiIds.length == 0) {
continue;
}
let user = userMap["id_" + k] || {};
let department = departmentDic[user.department_id || 0] || {};
await this.busistatSve.updateDepartmentName({
busiIds: busiIds,
user_name: user.nickName || "",
user_id: Number(k),
user_department_name: department.name || "",
});
}
}
this.outTradeNoKey = 'bpo_outtradeno';
async syncDepartmentStat(pobj) {
// 获取30天内数据
let t1 = new Date().getTime();
for (let i = 0; i < syncDays; i++) {
try {
let day = moment().subtract(syncDays - i, 'days').format('YYYY-MM-DD');
console.log(`---------------- begin ${day}`);
let t1 = new Date().getTime();
await this.syncDay({day: day});
let t2 = new Date().getTime();
console.log(`---------------- end ${day}`, t2 - t1);
} catch (e) {
console.log(e.stack);
}
}
let t2 = new Date().getTime();
console.log(t2 - t1, "------------------");
await this.syncUserDepartment();
return system.getResult2(1);
}
async syncDepartmentStatLocal(pobj) {
// 获取30天内数据
let t1 = new Date().getTime();
for (let i = 0; i < syncDays; i++) {
try {
let day = moment().subtract(syncDays - i, 'days').format('YYYY-MM-DD');
console.log(`---------------- begin ${day}`);
let t1 = new Date().getTime();
await this.syncDay({day: day, localdb: true});
let t2 = new Date().getTime();
console.log(`---------------- end ${day}`, t2 - t1);
} catch (e) {
console.log(e.stack);
}
}
let t2 = new Date().getTime();
console.log(t2 - t1, "------------------");
await this.syncUserDepartment();
return system.getResult2(1);
}
async syncDay(pobj) {
let day = pobj.day;
let dayNum = Number(day.replace(new RegExp("-", 'g'), ""));
let list;
if(pobj.localdb) {
list = await this.esettleSve.busiStatByDayLocal(day);
} else {
list = await this.esettleSve.busiStatByDay(day);
}
console.log(JSON.stringify(list));
await this.busistatSve.syncDayData(dayNum, list);
}
async settleCommission(obj, req) {
......@@ -280,4 +368,4 @@ class EcontractApi {
return uuid.join('');
}
}
module.exports = EcontractApi;
\ No newline at end of file
module.exports = EcontractApi;
var system = require("../../system")
var settings = require("../../../config/settings");
const CtlBase = require("../ctl.base");
const moment = require("moment");
class BusistatCtl extends CtlBase {
constructor() {
super(CtlBase.getServiceName(BusistatCtl));
this.departmentSve = system.getObject("service.departmentSve");
this.excelClient = system.getObject("util.excelClient");
}
async suggest(query,qobj,req){
var name = this.trim(qobj.name);
if (!name) {
return system.getResult2([])
}
var list = await this.departmentSve.suggestByName(name);
return system.getResult2(list);
}
async departmentList(queryobj, qobj, req) {
var params = qobj.search;
try {
if (params.begin) {
params.begin = Number(params.begin.replace(new RegExp("-", 'g'), ""));
}
if (params.end) {
params.end = Number(params.end.replace(new RegExp("-", 'g'), ""));
}
// this.doTimeCondition(params, ["statBegin", "statEnd"]);
let page = await this.service.departmentPage(params);
return system.getResult2(page);
} catch (e) {
console.log(e);
return system.getErrResult2("您的网络不稳, 请稍后重试");
}
}
async departmentExport(pobj, req, res) {
var params = JSON.parse(pobj.search);
if (params.begin) {
params.begin = Number(params.begin.replace(new RegExp("-", 'g'), ""));
}
if (params.end) {
params.end = Number(params.end.replace(new RegExp("-", 'g'), ""));
}
try {
params.currentPage = 1;
params.pageSize = -1;
let rows = await this.service.listByCondition(params);
let csvobj = {
fileName: "发薪统计-" + moment().format("YYYYMMDD") + ".csv",
rows: rows,
opts: {
fields: ['user_department_name', 'user_name', 'busi_id', 'busi_name', 'service_tax', 'actual_amt', 'deduct_amt', 'income_tax', 'added_value_tax', 'times'],
unwind: ['busistat'],
excelStrings: true,
unwindBlank: true
},
headers: {
'user_department_name':"部门名称",
'user_name': "业务员",
'busi_id': "商户号",
'busi_name': "企业名称",
'service_tax':"服务费",
'actual_amt':"实发金额",
'deduct_amt':"扣除金额",
'income_tax':"个税",
'added_value_tax':"增值税",
'times':"发薪次数",
},
};
await this.excelClient.exportCsv(req, res, csvobj);
} catch (e) {
console.log(e);
return system.getErrResult2("您的网络不稳, 请稍后重试");
}
}
}
module.exports = BusistatCtl;
var system = require("../../system")
var settings = require("../../../config/settings");
const CtlBase = require("../ctl.base");
class DepartmentCtl extends CtlBase {
constructor() {
super(CtlBase.getServiceName(DepartmentCtl));
}
}
module.exports = DepartmentCtl;
......@@ -21,6 +21,7 @@ class UserCtl extends CtlBase {
this.ejobapplySve = system.getObject("service.ejobapplySve");
this.redisClient = system.getObject("util.redisClient");
this.mailClient = system.getObject("util.mailClient");
this.departmentSve = system.getObject("service.departmentSve")
}
async findAndCountAll(queryobj, obj, req) {
var pageInfo = obj.pageInfo || {};
......@@ -118,13 +119,13 @@ class UserCtl extends CtlBase {
async getCurrentUser(qobj, pobj, req) {
var userid = req.headers.referer.substr(req.headers.referer.indexOf('userid') + 7);
// var accountInfo = await this.redisClient.get("yd_user_" + userid);
// var mobile = accountInfo.substr(accountInfo.indexOf('mobile') + 9,11);
// var name = accountInfo.substr(accountInfo.indexOf('userName') + 11,accountInfo.indexOf('mobile')-16);
// var personSign = accountInfo.substr(accountInfo.indexOf('personsSign') + 14,18);
// var bankno = accountInfo.substr(accountInfo.indexOf('bankno') + 9,16);
var accountInfoJson = await this.redisClient.get("yd_user_" + userid) || "";
var accountInfo = {};
if(accountInfoJson) {
......@@ -141,7 +142,7 @@ class UserCtl extends CtlBase {
userName: name,
bankno: bankno,
}
var result = {
status: 0,
message: "success",
......@@ -154,7 +155,7 @@ class UserCtl extends CtlBase {
//return system.getResult2(req.session.user);
}
async loginUser(qobj, pobj, req) {
var u = await super.findById(req.session.user.id);
......@@ -230,7 +231,7 @@ class UserCtl extends CtlBase {
var name = accountInfo.userName || "";
var personSign = accountInfo.personsSign || "";
var bankno = accountInfo.bankno || "";
if(openid) {
var existedUser = await this.service.getUserByOpenId(openid, appkey);
if(existedUser){
......@@ -241,7 +242,7 @@ class UserCtl extends CtlBase {
content: "cookie丢失,urlParam从新load," + JSON.stringify(req.query) + ",headers:"+ JSON.stringify(req.headers.referer),
clientIp: ""
});
var tmp = {
id: existedUser.id,
userName: existedUser.userName == "" ? name : existedUser.userName,
......@@ -789,8 +790,8 @@ class UserCtl extends CtlBase {
});
}
}
async loginyd2(req) {
try {
//日志记录
......@@ -1281,5 +1282,14 @@ class UserCtl extends CtlBase {
}
}
async suggestByName(qobj, pobj, req){
var name = this.trim(qobj.name);
if (!name) {
return system.getResult2([])
}
var list = await this.departmentSve.suggestByName(name);
return system.getResult2(list);
}
}
module.exports = UserCtl;
\ No newline at end of file
module.exports = UserCtl;
......@@ -45,6 +45,19 @@ class Dao{
var en= await this.model.destroy({where:{id:{[this.db.Op.in]:ids}}});
return en;
}
//批量插入
async bulkCreate(objs, t) {
if (!objs || objs.length == 0) {
return;
}
if (t) {
return await this.model.bulkCreate(objs, { transaction: t });
} else {
return await this.model.bulkCreate(objs);
}
}
async delete(qobj){
var en= await this.model.findOne({where:qobj});
if(en!=null){
......
const system = require("../../system");
const Dao = require("../dao.base");
class BusistatDao extends Dao {
constructor() {
super(Dao.getModelName(BusistatDao));
}
extraWhere(qobj, qw, qc) {
qc.raw = true;
return qw;
}
async delByDay(statDay) {
if (!statDay) {
return;
}
var sql = "DELETE FROM `c_busi_stat` WHERE stat_day = " + Number(statDay);
return await this.customExecAddOrPutSql(sql);
}
async updateDepartmentName(params) {
let sql = "UPDATE `c_busi_stat` SET user_name = :user_name, user_id=:user_id, user_department_name= :user_department_name WHERE busi_id IN (:busiIds)";
return await this.customExecAddOrPutSql(sql, {replacements: params});
}
async countByCondition(params) {
let sql = [];
sql.push("SELECT");
sql.push("COUNT(DISTINCT busi_id) AS num ");
sql.push("FROM `c_busi_stat`");
sql.push("WHERE 1 = 1");
this.setCondition(sql, params);
let list = await this.customQuery(sql.join(" "), params);
if (!list || list.length == 0) {
return 0;
}
return list[0].num || 0;
}
async listByCondition(params) {
params.currentPage = Number(params.currentPage || 1);
params.pageSize = Number(params.pageSize || 10);
params.startRow = (params.currentPage - 1) * params.pageSize;
let sql = [];
sql.push("SELECT");
sql.push("id, busi_name, user_name, user_department_name, ");
sql.push("SUM(times) AS times, SUM(amt) AS amt, SUM(actual_amt) AS actual_amt, SUM(deduct_amt) AS deduct_amt,");
sql.push("SUM(income_tax) AS income_tax, SUM(service_tax) AS service_tax, SUM(added_value_tax) AS added_value_tax");
sql.push("FROM `c_busi_stat`");
sql.push("WHERE 1 = 1");
this.setCondition(sql, params);
sql.push("GROUP BY busi_id ");
sql.push("ORDER BY service_tax DESC ");
if(params.pageSize && params.pageSize != -1) {
sql.push(" LIMIT :startRow, :pageSize ");
}
return await this.customQuery(sql.join(" "), params);
}
async setCondition(sql, params) {
if (!sql || !params) {
return;
}
if (params.busi_name) {
params.busi_name_like = `%${params.busi_name}%`;
sql.push("AND busi_name LIKE :busi_name_like");
}
if (params.user_department_name) {
sql.push("AND user_department_name = :user_department_name");
}
if(params.begin) {
sql.push("AND stat_day >= :begin");
}
if(params.end) {
sql.push("AND stat_day <= :end");
}
}
// async departmentList(params){
//
// var currentPage = Number(params.currentPage || 0);
// var pageSize = Number(params.pageSize || 10);
// var countsql = "SELECT COUNT(DISTINCT busi_id) AS num FROM `c_busi_stat` " + "WHERE 1 = 1 "
// var listsql = "SELECT busi_name,user_name,user_department_name,SUM(times) AS times,SUM(amt) AS amt,SUM(actual_amt) AS actual_amt,SUM(deduct_amt) AS deduct_amt,SUM(income_tax) AS income_tax,SUM(service_tax) AS service_tax,SUM(added_value_tax) AS added_value_taxFROM `c_busi_stat` WHERE 1 = 1 \n"
//
// if (params.busi_name) {
// countsql = countsql+" AND busi_name LIKE :busi_name";
// listsql = listsql+ " AND busi_name LIKE :busi_name"
// }
// if (params.user_department_name) {
// countsql = countsql+" AND user_department_name = :user_department_name"
// listsql = listsql+ " AND user_department_name = :user_department_name"
// }
// if(params.begin) {
// countsql = countsql + " AND created_at >= :begin ";
// listsql = listsql+ " AND stat_day >= :begin"
// }
// if(params.end) {
// countsql = countsql + " AND created_at <= :end ";
// listsql = listsql+ " AND stat_day <= :end"
// }
// console.log(countsql)
// console.log(listsql)
// var count = await this.customQuery(countsql, {busi_name:params.busi_name,user_department_name:params.user_department_name,begin:params.begin,end:params.end});
//
// if(count[0].num == 0 ){
//
// }
//
//
// }
}
module.exports = BusistatDao;
......@@ -70,6 +70,13 @@ class DbFactory {
constraints: false,
});
this.db.models.user.belongsTo(this.db.models.department, {
constraints: false,
});
this.db.models.department.hasMany(this.db.models.user, {
constraints: false,
});
this.db.models.econtract.belongsTo(this.db.models.etemplate, {
constraints: false,
});
......@@ -119,4 +126,4 @@ class DbFactory {
}
}
module.exports = DbFactory;
\ No newline at end of file
module.exports = DbFactory;
const system = require("../../system");
const Dao = require("../dao.base");
class DepartmentDao extends Dao {
constructor() {
super(Dao.getModelName(DepartmentDao));
}
async suggest(name) {
if (!name) {
return [];
}
var sql = "SELECT id, name FROM `p_department` WHERE name LIKE :queryLike AND deleted_at IS NULL ";
sql = sql + " ORDER BY id ASC ";
var list = await this.customQuery(sql, {queryLike: "%" + name + "%"});
return list || [];
}
}
module.exports = DepartmentDao;
......@@ -1355,7 +1355,27 @@ module.exports = {
},
],
},
{
"code": "sycpzx",
"isleft":true,
"label": "商业产品中心",
"icon":"el-icon-menu",
"isSubmenu": true,
"children": [
{
"code": "sycpzx_bpo", "isGroup": true,"icon":"fa fa-bars", "label": "BPO管理", "children": [
{
"code": "bpodepartmentstat",
"label": "发薪业绩",
"isMenu": true,
"bizCode": "bpodepartmentstat",
"bizConfig": null,
"path": ""
},
],
},
],
},
{
"code": "toolCenter",
"label": "H5",
......@@ -1635,7 +1655,7 @@ module.exports = {
"enttemplatemy": {"title": "模板管理", "config": null, "path": "/enttemplatemy", "comname": "enttemplatemy"},
"entcontractmy": {"title": "签约管理", "config": null, "path": "/entcontractmy", "comname": "entcontractmy"},
// "dkcompanyadmin": {"title": "企业管理", "config": null, "path": "/dkcompanyadmin", "comname": "dkcompanyadmin"},
"bpodepartmentstat": {"title": "发薪业绩", "config": null, "path": "/bpodepartmentstat", "comname": "bpodepartmentstat"},
},
"pauths": [
"add", "edit", "delete", "export", "show"
......
module.exports={
"bizName":"bpodepartmentstat",
"list":{
columnMetaData:[
]
},
"form":[
],
"search":[
],
"auth":{
"add":[
],
"edit":[
],
"delete":[
// {"icon":"el-icon-remove","title":"删除","type":"default","key":"delete","isInRow":true},
],
"common":[
],
}
}
......@@ -5,6 +5,7 @@ module.exports={
{"width":"120","label":"手机号","prop":"mobile","isShowTip":true,"isTmpl":false},
{"width":"100","label":"昵称","prop":"nickName","isShowTip":true,"isTmpl":false},
{"width":"100","label":"角色","prop":"Roles","isShowTip":true,"isTmpl":false},
{"width":"200","label":"所属部门","prop":"department.name","isShowTip":true,"isTmpl":false},
{"width":"80","label":"状态","prop":"isEnabled","isShowTip":true,"isTmpl":false},
{"width":"null","label":"操作","name":"null","isShowTip":false,"isTmpl":true,"isBtns":true},
]
......@@ -20,6 +21,9 @@ module.exports={
{"type":"input","label":"昵称","prop":"nickName","placeHolder":"昵称","style":""},
// {"type":"switch","label":"管理员","prop":"isAdmin","acText":"是管理员","inactText":"否","placeHolder":"请输入单次使用消耗的宝币数","style":""},
{"type":"select","label":"角色","refModel":"role","isMulti":true,"prop":"roles","labelField":"name","valueField":"id","style":""},
{"type":"select","label":"部门","refModel":"department","isMulti":false,"label":"部门","placeHolder":"请选择","prop":"department_id","labelField":"name","valueField":"id","style":"", "rules": [{ "required": true, "message": '请选择所属部门', "trigger": 'blur' }]},
]
},
],
......
const system = require("../../system");
const settings = require("../../../config/settings");
const uiconfig = system.getUiConfig2(settings.wxconfig.appId);
module.exports = (db, DataTypes) => {
return db.define("busistat", {
busi_id: DataTypes.STRING,
user_id: DataTypes.INTEGER,
stat_day: DataTypes.INTEGER,
busi_name: DataTypes.STRING,
user_name: DataTypes.STRING,
user_department_name: DataTypes.STRING(64),
times: DataTypes.INTEGER,
amt : DataTypes.INTEGER,
actual_amt : DataTypes.INTEGER,
deduct_amt : DataTypes.INTEGER,
income_tax : DataTypes.INTEGER,
service_tax : DataTypes.INTEGER,
added_value_tax : DataTypes.INTEGER,
}, {
paranoid: true, //假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'c_busi_stat',
validate: {
},
indexes: [
// Create a unique index on email
// {
// unique: true,
// fields: ['email']
// },
//
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// fields: ['data'],
// using: 'gin',
// operator: 'jsonb_path_ops'
// },
//
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// {
// name: 'public_by_author',
// fields: ['author', 'status'],
// where: {
// status: 'public'
// }
// },
//
// // A BTREE index with a ordered field
// {
// name: 'title_index',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
]
});
}
const system = require("../../system");
const settings = require("../../../config/settings");
const uiconfig = system.getUiConfig2(settings.wxconfig.appId);
module.exports = (db, DataTypes) => {
return db.define("department", {
name: DataTypes.STRING,
}, {
paranoid: true, //假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'p_department',
validate: {},
indexes: [
// Create a unique index on email
// {
// unique: true,
// fields: ['email']
// },
//
// // Creates a gin index on data with the jsonb_path_ops operator
// {
// fields: ['data'],
// using: 'gin',
// operator: 'jsonb_path_ops'
// },
//
// // By default index name will be [table]_[fields]
// // Creates a multi column partial index
// {
// name: 'public_by_author',
// fields: ['author', 'status'],
// where: {
// status: 'public'
// }
// },
//
// // A BTREE index with a ordered field
// {
// name: 'title_index',
// method: 'BTREE',
// fields: ['author', {attribute: 'title', collate: 'en_US', order: 'DESC', length: 5}]
// }
]
});
}
......@@ -53,6 +53,7 @@ module.exports = (db, DataTypes) => {
appId3rd: DataTypes.STRING(64),
userCode3rd: DataTypes.STRING(64),
branchCode3rd: DataTypes.STRING(64),
department_id : DataTypes.INTEGER,
}, {
paranoid: true, //假的删除
......@@ -97,4 +98,4 @@ module.exports = (db, DataTypes) => {
// }
]
});
}
\ No newline at end of file
}
const system = require("../../system");
const ServiceBase = require("../sve.base");
class BusistatService extends ServiceBase {
constructor() {
super(ServiceBase.getDaoName(BusistatService));
}
async syncDayData(statDay, list) {
if (!list || list.length == 0) {
return;
}
await this.dao.delByDay(statDay);
await this.dao.bulkCreate(list);
}
async updateDepartmentName(params) {
return await this.dao.updateDepartmentName(params);
}
async countByCondition(params) {
return await this.dao.countByCondition(params) || 0;
}
async listByCondition(params) {
let list = await this.dao.listByCondition(params);
this.setF2y(list);
return list;
}
async departmentPage(params) {
let total = await this.countByCondition(params);
if (total == 0) {
return { count: 0, rows: [] };
}
let list = await this.listByCondition(params);
return { count: total, rows: list };
}
setF2y(list) {
if (!list || list.length == 0) {
return;
}
for (let item of list) {
item.amt = system.f2y(item.amt);
item.actual_amt = system.f2y(item.actual_amt);
item.deduct_amt = system.f2y(item.deduct_amt);
item.income_tax = system.f2y(item.income_tax);
item.service_tax = system.f2y(item.service_tax);
item.added_value_tax = system.f2y(item.added_value_tax);
}
}
}
module.exports = BusistatService;
const system = require("../../system");
const ServiceBase = require("../sve.base");
class DepartmentService extends ServiceBase {
constructor() {
super(ServiceBase.getDaoName(DepartmentService));
}
async suggestByName(name){
return await this.dao.suggest(name);
}
async dict() {
let sql = "SELECT id, name FROM p_department WHERE deleted_at IS NULL";
return await this.customQuery(sql) || [];
}
async mapDict() {
let result = {};
let list = await this.dict();
for (let item of list) {
result[item.id] = item;
}
return result;
}
}
module.exports = DepartmentService;
......@@ -826,6 +826,23 @@ class EsettleService extends ServiceBase {
}
return list;
}
async mapBusiByIds(ids) {
let result = {};
if (!ids || ids.length == 0) {
return result;
}
var sql = "SELECT id, company_name FROM `tbl_busi` WHERE id IN (:ids)";
var list = await this.settledb.query(sql, { replacements: { ids: ids } });
if (list && list.length > 0) {
list = list[0, 0] || [];
for (let b of list) {
result[b.id] = b.company_name;
}
}
return result;
}
async findBybusiId(busiId) {
if (!busiId) {
return [];
......@@ -921,5 +938,103 @@ class EsettleService extends ServiceBase {
}
return list;
}
async busiStatByDay(day) {
if (!day) {
return [];
}
let dayNum = Number(day.replace(new RegExp("-", 'g'), ""))
let begin = day + " 00:00:00";
let end = day + " 23:59:59";
let sql = [];
// sql.push("SELECT ");
// sql.push(" busi_id,");
// sql.push(" COUNT(busi_id) AS times,");
// sql.push(" SUM(amt) AS amt,");
// sql.push(" SUM(actual_amt) AS actual_amt,");
// sql.push(" SUM(deduct_amt) AS deduct_amt,");
// sql.push(" SUM(income_tax) AS income_tax,");
// sql.push(" SUM(service_tax) AS service_tax,");
// sql.push(" SUM(added_value_tax) AS added_value_tax");
// sql.push("FROM");
// sql.push(" `tbl_order_item` ");
// sql.push("WHERE trade_status = '00' ");
// sql.push(" AND create_time >= :begin ");
// sql.push(" AND create_time <= :end ");
// sql.push("GROUP BY busi_id");
sql.push("SELECT ");
sql.push(" t1.busi_id,");
sql.push(" COUNT(t1.busi_id) AS times,");
sql.push(" SUM(t1.amt) AS amt,");
sql.push(" SUM(t1.actual_amt) AS actual_amt,");
sql.push(" SUM(t1.deduct_amt) AS deduct_amt,");
sql.push(" SUM(t1.income_tax) AS income_tax,");
sql.push(" SUM(t1.service_tax) AS service_tax,");
sql.push(" SUM(t1.added_value_tax) AS added_value_tax");
sql.push("FROM");
sql.push(" `tbl_order_item` t1");
sql.push("LEFT JOIN ( SELECT MIN( create_time ) AS createTime, order_item_id FROM tbl_order_item_info WHERE create_time >= :begin AND create_time <= :end GROUP BY order_item_id ) t5 ON t1.id = t5.order_item_id ");
sql.push("WHERE t1.trade_status = '00' ");
sql.push(" AND t5.createTime >= :begin ");
sql.push(" AND t5.createTime <= :end ");
sql.push("GROUP BY t1.busi_id ");
let list = await this.settledb.query(sql.join(" "), { replacements: { begin: begin, end: end } });
if (!list || list.length == 0) {
return [];
}
list = list[0, 0] || [];
let ids = [];
for (let item of list) {
item.stat_day = dayNum;
ids.push(item.busi_id);
}
let busiMap = await this.mapBusiByIds(ids);
for (let item of list) {
item.busi_name = busiMap[item.busi_id];
}
return list;
}
async busiStatByDayLocal(day) {
if (!day) {
return [];
}
let dayNum = Number(day.replace(new RegExp("-", 'g'), ""))
let begin = day + " 00:00:00";
let end = day + " 23:59:59";
let sql = [];
sql.push("SELECT ");
sql.push(" t1.busi_id,");
sql.push(" COUNT(t1.busi_id) AS times,");
sql.push(" SUM(t1.amt) AS amt,");
sql.push(" SUM(t1.actual_amt) AS actual_amt,");
sql.push(" SUM(t1.deduct_amt) AS deduct_amt,");
sql.push(" SUM(t1.income_tax) AS income_tax,");
sql.push(" SUM(t1.service_tax) AS service_tax,");
sql.push(" SUM(t1.added_value_tax) AS added_value_tax");
sql.push("FROM");
sql.push(" `tbl_order_item` t1");
sql.push("LEFT JOIN ( SELECT MIN( create_time ) AS createTime, order_item_id FROM tbl_order_item_info WHERE create_time >= :begin AND create_time <= :end GROUP BY order_item_id ) t5 ON t1.id = t5.order_item_id ");
sql.push("WHERE t1.trade_status = '00' ");
sql.push(" AND t5.createTime >= :begin ");
sql.push(" AND t5.createTime <= :end ");
sql.push("GROUP BY t1.busi_id ");
let list = await this.dao.customQuery(sql.join(" "), {begin: begin, end: end});
if (!list || list.length == 0) {
return [];
}
let ids = [];
for (let item of list) {
item.stat_day = dayNum;
ids.push(item.busi_id);
}
let busiMap = await this.mapBusiByIds(ids);
for (let item of list) {
item.busi_name = busiMap[item.busi_id];
}
return list;
}
}
module.exports = EsettleService;
......@@ -23,6 +23,26 @@ class EtemplatebusiService extends ServiceBase {
return 1;
}
async findOwnerBusiIdMap(template_type) {
template_type = template_type || 0;
let sql = [];
sql.push("SELECT t1.`busi_id`, t3.`owner_id` FROM `c_etemplate_busi` t1");
sql.push("INNER JOIN `c_etemplate` t2 ON t1.`template_id` = t2.`id` AND template_type = :template_type");
sql.push("INNER JOIN c_ecompany t3 ON t2.`ecompany_id` = t3.`id`");
sql.push("WHERE t3.`owner_id` > 0");
let list = await this.customQuery(sql.join(" "), {template_type: template_type});
let result = {};
if (!list || list.length == 0) {
return result;
}
for (let item of list) {
let busiIds = result[item.owner_id] || [];
busiIds.push(item.busi_id);
result[item.owner_id] = busiIds;
}
return result;
}
async suggest(name, ownerIds) {
return await this.dao.suggest(name, ownerIds);
}
......
......@@ -60,10 +60,31 @@ class UserService extends ServiceBase {
for (var row of page.rows) {
// this.handleDate(row, ["pay_complete_time"], "YYYY-MM-DD", -8);
await this.setRoles(page.rows);
await this.serDepartment(page.rows)
}
}
return page;
}
async serDepartment(list){
if(!list || list.length == 0) {
return;
}
var deIds = [];
for(var u of list) {
deIds.push(u.department_id);
}
var sql = [];
sql.push('SELECT id,name FROM `p_department` WHERE id IN (:deIds)');
var deList = await this.dao.customQuery(sql.join(" "), {deIds: deIds}) || [];
var dmap = {};
for(var de of deList) {
dmap[de.id] = de;
}
for(var u of list) {
u.department = dmap[u.department_id] || {};
}
}
async setRoles(list) {
if(!list || list.length == 0) {
......@@ -536,4 +557,4 @@ module.exports = UserService;
// console.log((result));
// }).catch(function(e){
// console.log(e);
// });
\ No newline at end of file
// });
<gsb-pcpage>
<div style="padding:20px;">
<div style="height: auto;min-width: 1000px; max-width: 1500px;">
<el-card style="background-color: #FFFFFF;padding:10px 10px 30px 10px;margin-top: 20px;">
<div style="width:100%;line-height: 40px;">
<div style="width:100%;line-height: 40px;">
<div style="float:left;width: 400px;">
<span style="color:2F2F2F;font-size: 14px; float:left;" >统计日期: </span>
<el-date-picker
v-model="search.begin"
type="date"
placeholder="开始时间"
style="width:140px;height: 36px;float:left;"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
default-value="">
</el-date-picker>
<el-date-picker
v-model="search.end"
type="date"
style="width:140px;height: 36px;margin-left: 16px;float:left;"
placeholder="结束时间"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
default-value="">
</el-date-picker>
</div>
<div style="float:left;width: 300px;">
<span style="color:2F2F2F;font-size: 14px;" >企业名称: </span>
<el-input v-model="search.busi_name" placeholder="请输入模板名称" maxlength="100" clearable style="max-width:200px;height: 36px;" ></el-input>
</div>
</div>
<div style="clear:both;height:20px;"></div>
<div style="width:100%;line-height: 40px;">
<div style="float:left;">
<span style="color:2F2F2F;font-size: 14px;" >业务部门: </span>
<el-select
v-model="search.user_department_name"
filterable
remote
clearable
reserve-keyword
style="width:340px;"
placeholder="请搜索公司名称"
@change="nameChange"
:remote-method="getCompanyNames"
:loading="nameLoading">
<el-option
v-for="item in nameList"
:key="item.id"
:label="item.name"
:value="item.name">
<span style="float: left;width:150px;">{{ item.name }}</span>
</el-option>
</el-select>
</div>
<div style="float:left;margin-top:5px;margin-left:50px;">
<el-button @click="resetSearch()" style="float:right;width:68px;height:36px;background-color: #54C4A7;color: #FFFFFF;font-size: 14px;padding-top:10px;" >重置</el-button>
<el-button @click="opSearch" style="float:right;width:68px;height:36px;background-color: #54C4A7;color: #FFFFFF;font-size: 14px;padding-top:10px;margin-right: 10px;" >搜索</el-button>
</div>
</div>
</div>
</el-card>
<el-card style="background-color: #FFFFFF;padding:10px 10px 30px 10px;margin-top: 20px;">
<div>
<div style="line-height: 36px;padding-bottom: 20px;">
<span style="float:left;color:#2F2F2F;font-size: 14px;">共{{search.total}}条记录</span>
<el-button @click="exportList()" style="float:right;width:110px;height:36px;color: #FFFFFF;font-weight: 400;border-radius: 4px;font-size: 14px;background-color: #59C1A6;padding-top:11px">导出</el-button>
</div>
<div>
<el-table
stripe
fix="true"
:data="search.list"
tooltip-effect="light"
style="min-width: 1000px;max-width: 1500px;margin-top: 23px;min-height: 500px;"
empty-text="暂无需求"
header-cell-style="background-color: #F5F5F5;color: #2F2F2F;font-size: 14px;font-weight:400;"
row-style="height:50px;" >
<el-table-column prop="id" label="序号" :formatter="onColFormater" width="80" align="center" ></el-table-column>
<el-table-column prop="user_department_name" label="部门名称" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="user_name" label="业务员" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="busi_id" label="商户号" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="busi_name" label="公司名称" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="actual_amt" label="实发金额" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="service_tax" label="服务费金额" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="deduct_amt" label="总扣除金额" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="income_tax" label="个税金额" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="added_value_tax" label="增值税金额" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="times" label="发薪笔数" :formatter="onColFormater" align="center" ></el-table-column>
</el-table>
<div style="width:100%;text-align: center;margin-top: 20px">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="search.currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="search.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="search.total">
</el-pagination>
</div>
</div>
</div>
</el-card>
<el-dialog width="862px" :visible.sync="showEdit">
<div slot="title">
<span style="margin-left:9px;margin-top:-3px;;width:72px; height:25px; font-size:18px; font-family:PingFangSC-Regular; font-weight:400; color:rgba(51,51,51,1); line-height:25px;">{{editTitle}}模板</span>
<div style="width: 862px; height: 1px;background-color: #E3E3E3;margin: 17px 20px 0px -20px"></div>
</div>
<el-form :model="etemplate" :rules="rules" ref="etemplate" label-width="100px" label="right" style="padding:0px 100px;" >
<div style="0px 10px; line-height: 15px;padding-bottom:40px;">
<div style="width:2px;height:15px;float: left;background-color: #54C4A7">
</div>
<span style="font-size:15px;color: #333333;float: left;font-weight:bold;margin-left: 7px;">模板信息</span>
</div>
<el-form-item label="模板名称:" prop="name" >
<el-input v-model="etemplate.name" placeholder="请输入模板名称:例如韵达、沐冉" maxlength="50" style="width:468px;" clearable ></el-input>
</el-form-item>
<el-form-item label="所属公司:" prop="ecompanyName">
<el-select
v-model="etemplate.ecompanyName"
filterable
remote
clearable
reserve-keyword
style="width:468px;"
placeholder="请搜索公司名称"
@change="nameChange2"
:remote-method="getCompanyNames2"
:loading="nameLoading2">
<el-option
v-for="item in nameList2"
:key="item.id"
:label="item.name"
:value="item.name">
<span style="float: left;width:150px;">{{ item.name }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="签约主体:" prop="ecompanyMainId" >
<el-select v-model="etemplate.ecompanyMainId" style="width:468px;" filterable placeholder="请选择">
<el-option
v-for="item in mainList"
:key="item.id"
:label="item.alias"
:value="item.id">
</el-option>
</el-select>
<!-- <el-input v-model="etemplate.nameA" placeholder="请输入签约主体" maxlength="50" style="width:468px;" clearable ></el-input> -->
</el-form-item>
<el-form-item label="签约协议:" prop="filepath">
<gsb-upload3 ref="upload3" v-model="uploadResult" @uploadsuccess="uploadsuccess" :fileList="fileList" filetype="pdf"></gsb-upload3>
</el-form-item>
<el-form-item label="备注信息:" prop="remark" >
<el-input type="textarea" v-model="etemplate.remark" placeholder="请输入备注信息" maxlength="50" style="width:468px;" clearable ></el-input>
</el-form-item>
<el-form-item label="模板参数:" prop="placeholderkey" >
<el-input v-model="etemplate.placeholderkey" placeholder="请输入模板参数" maxlength="255" style="width:468px;" showlist="true" :file-list="fileList" clearable ></el-input>
</el-form-item>
</el-form>
<div style="margin-left: 200px;">
<el-button :loading="saveLoading" @click="saveTemplate" style="width:120px;height:36px; background:#54C4A7; border-radius:4px;color: #FFFFFF;font-size: 16px;padding-top: 10px;">保存</el-button>
</div>
</el-dialog>
<el-dialog width="862px" :visible.sync="showrelevances" @close="clearInput">
<div slot="title">
<span style="margin-left:9px;margin-top:-3px;;width:72px; height:25px; font-size:18px; font-family:PingFangSC-Regular; font-weight:400; color:rgba(51,51,51,1); line-height:25px;">关联信息</span>
<div style="width: 862px; height: 1px;background-color: #E3E3E3;margin: 17px 20px 0px -20px"></div>
</div>
<el-form :model="etemplatebusi" :rules="rules" ref="etemplatebusi" label-width="85px" label="right" style="padding:0px 100px;" >
<el-form-item label="公司:" prop="company_id">
<el-select
v-model="etemplatebusi.company_id"
filterable
remote
clearable
reserve-keyword
style="width:420px;float: left;"
placeholder="请搜索公司名称"
@change="nameChange3"
:remote-method="getCompanyNames3"
:loading="nameLoading2">
<el-option
v-for="item in nameList2"
:key="item.id"
:label="item.company_name"
:value="item.id">
<span style="float: left;width:150px;">{{ item.company_name }}--{{ item.id }}</span>
</el-option>
</el-select>
<el-button :loading="saveLoading" @click="saveTemplatebusi" style="width:80px;height:41px; background:#54C4A7; border-radius:4px;color: #FFFFFF;font-size: 16px;padding-top: 10px;">保存</el-button>
</el-form-item>
</el-form>
<el-table :data="busiData">
<el-table-column prop="id" label="序号" :formatter="onColFormater" width="80" align="center" ></el-table-column>
<el-table-column prop="busi_id" label="公司ID" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="busi_company_name" label="公司名称" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column label="操作" align="center" >
<template slot-scope="scope">
<a href="javascript:;" @click="deleteTetId(scope.row.id)" style="text-decoration: none;color:;font-size: 14px;">删除</a>
</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</gsb-pcpage>
{
template: '${tmpl}',
data: function () {
var validMethod = (rule, value, callback) => {
return this.validfileds(rule, value, callback);
};
return {
etemplate: {isEnabled:true},
etemplatebusi: {isEnabled:true},
editTitle: "新增",
showEdit: false,
showrelevances: false,
saveLoading: false,
busiData:[],
nameLoading: false,
nameList: [],
nameMap: [],
nameLoading2: false,
nameList2: [],
nameMap2:[],
uploadResult: null,
fileList:[],
mainList:[],
search: {
list: [],
currentPage: 1,
pageSize: 20,
total : 0,
name:'',
begin: '',
end: '',
},
rules: {
ecompanyName : [
{ required: true, message: '请输入公司名称', trigger: 'blur' },
{ validator: validMethod, trigger: 'blur' }
],
company_id : [
{ required: true, message: '请输入公司名称', trigger: 'blur' },
{ validator: validMethod, trigger: 'blur' }
],
ecompanyMainId: [
{ required: true, message: '请选择签约主体', trigger: 'blur' },
],
filepath: [
{ required: true, message: '请上传签约协议', trigger: 'blur' },
],
a : [],
},
busi_id: 0,
}
},
mounted: function () {
this.resetSearch(true, true);
this.getMainList();
},
created: function () {},
methods: {
setWeekDay(){
if (this.search.begin && this.search.end) {
return;
}
var now = new Date();
var nowDayOfWeek = now.getDay();
var nowDay = now.getDate();
var nowMonth = now.getMonth();
var nowYear = now.getYear();
nowYear += (nowYear < 2000) ? 1900 : 0;
var weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1);
this.search.begin = this.formatDate(weekStartDate);
var weekEndDate = new Date(nowYear, nowMonth, nowDay + (6 - nowDayOfWeek) + 1);
this.search.end = this.formatDate(weekEndDate);
console.log(this.search);
},
formatDate(date) {
var myyear = date.getFullYear();
var mymonth = date.getMonth() + 1;
var myweekday = date.getDate();
if (mymonth < 10) {
mymonth = "0" + mymonth;
}
if (myweekday < 10) {
myweekday = "0" + myweekday;
}
return (myyear + "-" + mymonth + "-" + myweekday);
},
getEmptySearch() {
return {
list: [],
currentPage: 1,
pageSize: 20,
total : 0,
name:'',
}
},
resetSearch(flag, defaultWeek) {
this.search = this.getEmptySearch();
if (defaultWeek) {
this.setWeekDay();
}
this.getList();
},
tableHeaderColor({ row, column, rowIndex, columnIndex }) {
if (rowIndex === 0) {
return 'background-color: #F5F5F5;color: #2F2F2F;font-size: 14px;font-weight:400;'
}
},
opSearch() {
this.search.currentPage = 1;
this.search.total = 0;
this.getList();
},
getMainList() {
var self = this;
this.$root.postReq("/web/ecompanymainCtl/all", {
}).then(function (d) {
if (d.status == 0) {
self.mainList = d.data || [];
} else {
}
});
},
getList() {
var self = this;
var params = this.getParams();
this.$root.postReq("/web/busistatCtl/departmentList", {
search: params
}).then(function (d) {
if (d.status == 0) {
self.search.list = d.data.rows || [];
self.search.total = d.data.count || 0;
} else {
}
});
},
exportList() {
window.open("/web/busistatCtl/departmentExport" + this.getExportParams());
},
getParams() {
var params = {};
for(var f in this.search) {
if(f == "list") {
continue;
}
params[f] = this.search[f];
}
return params;
},
getExportParams() {
var params = {};
for(var f in this.search) {
if(f == "list") {
continue;
}
params[f] = this.search[f];
}
return "?search=" + encodeURIComponent(JSON.stringify(params));
},
onColFormater(row, column, cellValue, index) {
return cellValue || "---";
},
getEtemplate(id) {
var self = this;
self.$root.postReq("/web/etemplateCtl/info", {
id: id,
}).then(function (d) {
if (d.status == 0) {
if(d.data) {
d.data.isEnabled = d.data.isEnabled ? true : false;
}
self.etemplate = d.data;
if(self.etemplate.filepath) {
self.fileList = [{
name: "模板文件",
url: self.etemplate.filepath,
}];
} else {
self.uploadResult = null;
}
} else {
self.$message.warning(d.msg || `您的网络不稳定, 请稍后重试`);
}
});
},
clearInput(){
this.$refs.etemplatebusi.resetFields();
},
addCompany() {
this.companysForm.bpoCompanyList.push({
companyName: '',
key: Date.now(),
rules: {required: true, message: '公司名称不能为空', trigger: 'blur'},
});
},
getEtemplate_relevance(id) {
var self = this;
this.busi_id = id;
this.$root.postReq("/web/etemplatebusiCtl/getlist", {
id: id,
type:1,
}).then(function (d) {
self.template_id = id;
self.busiData = d || [];
});
},
toDetail(id) {
},
openEdit(id) {
this.clearUpload();
if(id) {
this.editTitle = "修改";
this.getEtemplate(id);
} else {
this.editTitle = "新增";
this.etemplate = {isEnabled:true};
}
this.showEdit = true;
},
relevance(id){
this.getEtemplate_relevance(id);
this.showrelevances = true;
},
handleSizeChange(val) {
this.search.pageSize = val;
this.resetSearch();
},
handleCurrentChange(val) {
this.search.currentPage = val;
this.getList();
},
validfileds(rule, value, callback) {
var self = this;
if(rule.field == "ecompanyName") {
if(!self.etemplate.ecompany_id) {
return callback(new Error("请重新选择公司名称"));
}
}
return callback();
},
nameChange(val) {
var self = this;
var item = self.nameMap[val];
self.search.ecompany_id = (item || {}).id || "";
},
nameChange2(val) {
var self = this;
var item = self.nameMap2[val];
self.etemplate.ecompany_id = (item || {}).id || "";
},
nameChange3(val) {
var self = this;
var item = self.nameMap2[val];
self.etemplate.ecompany_id = (item || {}).id || "";
},
getCompanyNames(query) {
var self = this;
self.nameLoading = true;
self.$root.postReq("/web/busistatCtl/suggest", {
name: query
}).then(function (d) {
self.nameLoading = false;
self.nameList = d.data || [];
self.nameMap = [];
for(var item of self.nameList) {
self.nameMap[item.name] = item;
}
});
setTimeout(() => {
self.nameLoading = false;
}, 15000);
},
getCompanyNames2(query) {
var self = this;
self.nameLoading2 = true;
self.$root.postReq("/web/ecompanyCtl/suggest", {
name: query
}).then(function (d) {
self.nameLoading2 = false;
self.nameList2 = d.data || [];
self.nameMap2 = [];
for(var item of self.nameList2) {
self.nameMap2[item.name] = item;
}
});
setTimeout(() => {
self.nameLoading2 = false;
}, 15000);
},
getCompanyNames3(query) {
var self = this;
self.nameLoading2 = true;
self.$root.postReq("/web/etemplatebusiCtl/suggest", {
name: query
}).then(function (d) {
self.nameLoading2 = false;
self.nameList2 = d.data || [];
self.nameMap2 = [];
for(var item of self.nameList2) {
self.nameMap2[item.name] = item;
}
});
setTimeout(() => {
self.nameLoading2 = false;
}, 15000);
},
clearUpload() {
var self = this;
self.uploadResult = null;
self.etemplate.filepath = "";
if(self.$refs.upload3 && self.$refs.upload3.$refs && self.$refs.upload3.$refs.upload) {
self.$refs.upload3.$refs.upload.clearFiles();
}
},
uploadsuccess(v) {
if(!v || !v[0] || !v[0].url) {
this.$message.warning("上传失败");
return;
}
this.etemplate.filepath = v[0].url;
},
saveTemplate() {
var self = this;
self.$refs.etemplate.validate((valid) => {
if (valid) {
self.saveLoading = true;
setTimeout(() => {
self.saveLoading = false;
}, 15000);
self.$root.postReq("/web/etemplateCtl/mysave", self.etemplate).then(function (d) {
if (d.status == 0) {
self.$message.success(`保存成功`);
self.showEdit = false;
self.getList();
} else {
self.$alert(d.msg || '保存失败', '提示', {
confirmButtonText: '确定',
callback: action => {}
});
}
self.saveLoading = false;
});
} else {
self.saveLoading = false;
return false;
}
});
},
saveTemplatebusi() {
var self = this;
self.$refs.etemplatebusi.validate((valid) => {
if (valid) {
self.saveLoading = true;
setTimeout(() => {
self.saveLoading = false;
}, 15000);
self.etemplatebusi.template_id = self.busi_id;
self.etemplatebusi.template_type = 1;
self.$root.postReq("/web/etemplatebusiCtl/mysave", self.etemplatebusi).then(function (d) {
if (d.status == 0) {
self.$message.success(`保存成功`);
self.showEdit = false;
self.getEtemplate_relevance(self.busi_id);
} else {
self.$alert(d.msg || '保存失败', '提示', {
confirmButtonText: '确定',
callback: action => {}
});
}
self.saveLoading = false;
});
} else {
self.saveLoading = false;
return false;
}
});
},
deleteTetId(id){
var self = this;
self.$root.postReq("/web/etemplatebusiCtl/deleteTetId", {
id: id,
}).then(function (d) {
if (d.status == 0) {
self.$message.success(`已删除`);
self.showrelevances = true;
self.getEtemplate_relevance(self.busi_id);
} else {
self.$message.warning(d.msg || `您的网络不稳定, 请稍后重试`);
}
});
}
},
vname: "gsb-ecompanyadmin"
}
......@@ -21,7 +21,7 @@
title="bpo结算公司权限"
:visible.sync="showBind"
width="570px">
<el-form :model="companysForm" ref="companysForm" label-width="100px" label="right" >
<el-form-item
v-for="item in companysForm.bpoCompanyList"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment