Commit 5382e263 by zhaoxiqing

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

parents 28a17f86 7a600042
......@@ -2,52 +2,39 @@ var system = require("../../system")
var moment = require("moment");
const md5 = require("MD5");
const logCtl = system.getObject("web.oplogCtl");
const syncDays = Number(30);
class EcontractApi {
constructor() {
this.esettleSve = system.getObject("service.esettleSve");
this.busistatSve = system.getObject("service.busistatSve");
this.salesmanSve = system.getObject("service.salesmanSve");
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) {
async syncUserDepartment() {
let busimap = await this.salesmanSve.mapSalesmen();
for (let busiId in busimap) {
let salesman = busimap[busiId] || {name: "", department_name: "未设置部门", mobile: ""};
if (!salesman) {
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 || "",
busiIds: [busiId],
user_name: salesman.name || "",
user_mobile: salesman.mobile || "",
user_department_name: salesman.department_name || "",
});
}
}
async syncDepartmentStat(pobj) {
pobj = pobj || {};
let syncDays = Number(pobj.syncDays || 10);
// 获取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();
......@@ -60,42 +47,17 @@ class EcontractApi {
}
let t2 = new Date().getTime();
console.log(t2 - t1, "------------------");
await this.syncUserDepartment();
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);
}
let list = await this.esettleSve.busiStatByDay(day);
console.log(JSON.stringify(list));
await this.busistatSve.syncDayData(dayNum, list);
}
......
......@@ -54,7 +54,7 @@ class BusistatCtl extends CtlBase {
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'],
fields: ['user_department_name', 'user_name', 'busi_id', 'busi_name', 'trans_amt', 'service_tax', 'actual_amt', 'deduct_amt', 'income_tax', 'added_value_tax', 'times'],
unwind: ['busistat'],
excelStrings: true,
unwindBlank: true
......@@ -64,6 +64,7 @@ class BusistatCtl extends CtlBase {
'user_name': "业务员",
'busi_id': "商户号",
'busi_name': "企业名称",
'trans_amt':"充值金额",
'service_tax':"服务费",
'actual_amt':"实发金额",
'deduct_amt':"扣除金额",
......
......@@ -20,7 +20,7 @@ class BusistatDao extends Dao {
}
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)";
let sql = "UPDATE `c_busi_stat` SET user_name = :user_name, user_mobile=:user_mobile, user_department_name= :user_department_name WHERE busi_id IN (:busiIds)";
return await this.customExecAddOrPutSql(sql, {replacements: params});
}
......@@ -47,7 +47,8 @@ class BusistatDao extends Dao {
let sql = [];
sql.push("SELECT");
sql.push("id, busi_id, busi_name, user_name, user_department_name, ");
sql.push("id, busi_id, busi_name, user_name,user_mobile, user_department_name, ");
sql.push("SUM(trans_amt) AS trans_amt,");
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`");
......
const system = require("../../system");
const Dao = require("../dao.base");
class SalesmanDao extends Dao {
constructor() {
super(Dao.getModelName(SalesmanDao));
}
async mapSalesmen(params) {
params = params || {};
let sql = [];
sql.push("SELECT");
sql.push("t1.`busi_id`, ");
sql.push("t2.`name`, t2.`mobile`, t2.`department_name`");
sql.push("FROM `p_salesman_busi` t1");
sql.push("INNER JOIN `p_salesman` t2 ON t1.`sales_id` = t2.`id`");
sql.push("WHERE 1 = 1 ");
if (params.busiIds && params.busiIds.length > 0) {
sql.push("AND t1.`busi_id` IN (:busiIds)");
}
let list = await this.customQuery(sql.join(" "), params)
let map = {};
for (let item of list) {
map[item.busi_id] = item;
}
return map;
}
}
module.exports = SalesmanDao;
......@@ -5,7 +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":"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},
]
......@@ -21,8 +21,7 @@ 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' }]},
// {"type":"select","label":"部门","refModel":"department","isMulti":false,"label":"部门","placeHolder":"请选择","prop":"department_id","labelField":"name","valueField":"id","style":"", "rules": [{ "required": true, "message": '请选择所属部门', "trigger": 'blur' }]},
]
},
......
......@@ -4,18 +4,19 @@ 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_mobile: 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,
trans_amt : DataTypes.BIGINT,
amt : DataTypes.BIGINT,
actual_amt : DataTypes.BIGINT,
deduct_amt : DataTypes.BIGINT,
income_tax : DataTypes.BIGINT,
service_tax : DataTypes.BIGINT,
added_value_tax : DataTypes.BIGINT,
}, {
paranoid: true, //假的删除
underscored: true,
......
const system = require("../../system");
const settings = require("../../../config/settings");
const uiconfig = system.getUiConfig2(settings.wxconfig.appId);
module.exports = (db, DataTypes) => {
return db.define("salesman", {
name: DataTypes.STRING,
mobile: DataTypes.STRING,
department_id: DataTypes.INTEGER,
department_name: DataTypes.STRING,
}, {
paranoid: true, //假的删除
underscored: true,
version: true,
freezeTableName: true,
//freezeTableName: true,
// define the table's name
tableName: 'p_salesman',
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}]
// }
]
});
}
......@@ -41,6 +41,7 @@ class BusistatService extends ServiceBase {
return;
}
for (let item of list) {
item.trans_amt = system.f2y(item.trans_amt);
item.amt = system.f2y(item.amt);
item.actual_amt = system.f2y(item.actual_amt);
item.deduct_amt = system.f2y(item.deduct_amt);
......
......@@ -11,6 +11,7 @@ class EsettleService extends ServiceBase {
this.ecompanyDao = system.getObject("db.ecompanyDao");
this.epartnerDao = system.getObject("db.epartnerDao");
this.userDao = system.getObject("db.userDao");
this.salesmanDao = system.getObject("db.salesmanDao");
this.usereaccountDao = system.getObject("db.usereaccountDao");
this.esettlecommissionDao = system.getObject("db.esettlecommissionDao");
this.pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;
......@@ -948,21 +949,6 @@ class EsettleService extends ServiceBase {
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,");
......@@ -989,13 +975,64 @@ class EsettleService extends ServiceBase {
item.stat_day = dayNum;
ids.push(item.busi_id);
}
let busiMap = await this.mapBusiByIds(ids);
// 获取商户充值统计
let rechargeMap = await this.mapStatByDay(day);
// 充值流水商户ids
let rechargeBusiIds = Object.keys(rechargeMap) || [];
// 将发薪和充值的商户id做并集
let busiIds = Array.from(new Set([...ids, ...rechargeBusiIds]));
// 查商户名
let busiMap = await this.mapBusiByIds(busiIds);
for (let item of list) {
item.busi_name = busiMap[item.busi_id];
item.busi_name = busiMap[item.busi_id] || "";
item.trans_amt = rechargeMap[item.busi_id] || 0;
}
if (rechargeBusiIds.length > 0) {
for (let rid of rechargeBusiIds) {
if (ids.indexOf(rid) == -1) {
let item = {busi_id: rid, stat_day: dayNum, times: 0, amt: 0, actual_amt: 0, deduct_amt: 0, income_tax: 0, service_tax: 0, added_value_tax: 0};
item.busi_name = busiMap[rid] || "";
item.trans_amt = rechargeMap[rid] || 0;
list.push(item);
}
}
}
return list;
}
async mapStatByDay(day) {
if (!day) {
return {};
}
let begin = day + " 00:00:00";
let end = day + " 23:59:59";
let sql = [];
sql.push("SELECT ");
sql.push(" bus_id,");
sql.push(" SUM(trans_amt) AS trans_amt");
sql.push("FROM");
sql.push(" tbl_busi_account_info ");
sql.push("WHERE 1 = 1");
sql.push(" AND busi_type = '00'");
sql.push(" AND create_time >= :begin");
sql.push(" AND create_time <= :end");
sql.push("GROUP BY bus_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 map = {};
for (let item of list) {
map[item.bus_id] = item.trans_amt;
}
return map;
}
async busiStatByDayLocal(day) {
if (!day) {
return [];
......
const system = require("../../system");
const ServiceBase = require("../sve.base");
class SalesmanService extends ServiceBase {
constructor() {
super(ServiceBase.getDaoName(SalesmanService));
}
async suggestByName(name){
return await this.dao.suggest(name);
}
async mapSalesmen(params) {
return await this.dao.mapSalesmen(params);
}
}
module.exports = SalesmanService;
......@@ -9,7 +9,7 @@ var settings = {
// dbname : "bpo",
// user : "write",
// password : "write",
dbname: "bpo2",
dbname: "bpo",
user: "write",
password: "write",
config: {
......
......@@ -83,11 +83,12 @@
<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="trans_amt" 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">
......
......@@ -14,7 +14,6 @@
saveLoading: false,
busiData:[],
nameLoading: false,
nameList: [],
nameMap: [],
......@@ -56,39 +55,11 @@
}
},
mounted: function () {
this.resetSearch(true, true);
this.resetSearch(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: [],
......@@ -98,11 +69,8 @@
name:'',
}
},
resetSearch(flag, defaultWeek) {
resetSearch(flag) {
this.search = this.getEmptySearch();
if (defaultWeek) {
this.setWeekDay();
}
this.getList();
},
tableHeaderColor({ row, column, rowIndex, columnIndex }) {
......@@ -163,7 +131,7 @@
},
onColFormater(row, column, cellValue, index) {
return cellValue || "---";
return cellValue;
},
getEtemplate(id) {
var self = this;
......
......@@ -26,18 +26,18 @@
</span>
<a @click="dialogFormVisible = true" href="javascript:;" style="float: left;text-decoration: none;color:#59C1A6;font-size: 16px;">修改</a>
</div>
<div v-if="companyForm.user.utype == 1" style="clear:both;line-height: 30px;padding-top: 40px;">
<span style="float:left;color: #38404B;font-size: 16px;width:80px;">
所属部门
</span>
<span v-if="companyForm.user.department" style="float:left;padding-left: 80px;color: #38404B;font-size: 16px;width: 350px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
{{companyForm.user.department.name}}
</span>
<span v-if="!companyForm.user.department" style="float:left;padding-left: 80px;color: #38404B;font-size: 16px;width: 350px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
</span>
<a v-if="!companyForm.user.department" @click="show_department = true" href="javascript:;" style="float: left;text-decoration: none;color:#59C1A6;font-size: 16px;">填写</a>
</div>
<!-- <div v-if="companyForm.user.utype == 1" style="clear:both;line-height: 30px;padding-top: 40px;">-->
<!-- <span style="float:left;color: #38404B;font-size: 16px;width:80px;">-->
<!-- 所属部门-->
<!-- </span>-->
<!-- <span v-if="companyForm.user.department" style="float:left;padding-left: 80px;color: #38404B;font-size: 16px;width: 350px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">-->
<!-- {{companyForm.user.department.name}}-->
<!-- </span>-->
<!-- <span v-if="!companyForm.user.department" style="float:left;padding-left: 80px;color: #38404B;font-size: 16px;width: 350px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">-->
<!-- 无-->
<!-- </span>-->
<!-- <a v-if="!companyForm.user.department" @click="show_department = true" href="javascript:;" style="float: left;text-decoration: none;color:#59C1A6;font-size: 16px;">填写</a>-->
<!-- </div>-->
</div>
</div>
</div>
......
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