Commit 6d3e1eb1 by 王昆

'个体户审核页面简单应用开发'

parent 64a6e6e3
......@@ -19,5 +19,38 @@ class BMmerchantcompanyDao extends Dao{
return list;
}
async findMapByIds(ids) {
let result = {};
if(!ids || ids.length == 0) {
return result;
}
let sql = "SELECT * FROM bm_merchant_company where id IN (:ids) ";
let list = await this.customQuery(sql, {ids:ids});
if(!list || list.length == 0) {
return result;
}
for(let item of list) {
result[item.id] = item;
}
return result;
}
async setMerchantCompany(list, idField) {
if (!list || list.length == 0) {
return;
}
let ids = [];
for (let item of list) {
ids.push(item[idField] || 0);
}
let map = await this.findMapByIds(ids);
for (let item of list) {
item.merchantCompany = map[(item.id || 0)] || {};
}
}
}
module.exports=BMmerchantcompanyDao;
......@@ -28,7 +28,64 @@ class BmuserbizDao extends Dao{
let sql = `UPDATE ${this.model.tableName} SET front_half_img = :front_half_img, declaration_file = :declaration_file, updated_at = NOW() WHERE idcard = :idcard`;
let rs = await this.customUpdate(sql, params);
return rs;
}
async countByCondition(params) {
let sql = [];
sql.push("SELECT");
sql.push("count(DISTINCT t1.id) as num");
sql.push("FROM bm_user_biz t1");
sql.push("INNER JOIN bm_order t2 ON t1.orderId = t2.id");
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;
}
async listByCondition(params) {
params.startRow = Number(params.startRow || 0);
params.pageSize = Number(params.pageSize || 10);
let sql = [];
sql.push("SELECT");
sql.push("t1.*, ");
sql.push("t1.merchantId, t2.companyId, t2.orderNo, t2.audit_status");
sql.push("FROM bm_user_biz t1");
sql.push("INNER JOIN bm_order t2 ON t1.orderId = t2.id");
sql.push("WHERE 1 = 1 ");
this.setCondition(sql, params);
sql.push("ORDER BY t1.id DESC");
sql.push("LIMIT :startRow, :pageSize");
return await this.customQuery(sql.join(" "), params);
}
setCondition(sql, params) {
if (!params || !sql) {
return;
}
if (params.hasOwnProperty("audit_status")) {
sql.push("AND t2.audit_status = :audit_status");
}
if (params.merchantId) {
sql.push("AND t1.merchantId = :merchantId");
}
if (params.legalName) {
params.legalNameLike = `%${params.legalName}%`;
sql.push("AND t1.legal_name LIKE :legalNameLike");
}
if (params.legal_mobile) {
sql.push("AND t1.legal_mobile = :legal_mobile");
}
if (params.idcard) {
sql.push("AND t1.idcard = :idcard");
}
}
}
module.exports=BmuserbizDao;
const system=require("../../system");
const ServiceBase=require("../sve.base");
const system = require("../../system");
const ServiceBase = require("../sve.base");
const md5 = require("md5");
class BmuserbizService extends ServiceBase{
constructor(){
super(ServiceBase.getDaoName(BmuserbizService));
//this.appDao=system.getObject("db.appDao");
this.restClient = system.getObject("util.restClient");
class BmuserbizService extends ServiceBase {
constructor() {
super(ServiceBase.getDaoName(BmuserbizService));
//this.appDao=system.getObject("db.appDao");
this.restClient = system.getObject("util.restClient");
this.bmmerchantcompanyDao = system.getObject("db.bmmerchantcompanyDao");
}
async saveByStep(userbiz) {
if(!userbiz || !userbiz.id) {
if (!userbiz || !userbiz.id) {
return;
}
var biz = await this.findById(userbiz.id);
var step = biz.step;
if(step == 1) {
if (step == 1) {
biz.idcard_front = userbiz.idcard_front;
biz.idcard_back = userbiz.idcard_back;
biz.idcard = userbiz.idcard;
biz.realName = userbiz.realName;
biz.step = 2;
} else if(step == 2) {
} else if (step == 2) {
biz.bank_front = userbiz.bank_front;
biz.bank_back = userbiz.bank_back;
biz.bank = userbiz.bank;
......@@ -33,12 +35,12 @@ class BmuserbizService extends ServiceBase{
// if(stdout.code != 0) {
// return stdout.msg || "银行三要素(姓名、身份证、银行卡)验证失败"
// }
} else if(step == 3) {
} else if (step == 3) {
biz.person_img = userbiz.person_img;
biz.legal_name = userbiz.legal_name;
biz.legal_mobile = userbiz.legal_mobile;
biz.step = 4;
} else if(step == 4) {
} else if (step == 4) {
biz.companyNames = userbiz.companyNames;
biz.businessScope = userbiz.businessScope;
biz.step = 5;
......@@ -51,7 +53,7 @@ class BmuserbizService extends ServiceBase{
async checkBank(biz) {
var params = {
accNo : biz.bankno,
accNo: biz.bankno,
idName: biz.realName,
idNo: biz.idcard,
nonceStr: await this.getUidStr(16),
......@@ -66,5 +68,30 @@ class BmuserbizService extends ServiceBase{
async updateSupplement(params) {
return this.dao.updateSupplement(params);
}
async pageByCondition(params) {
let currentPage = Number(params.currentPage || 1);
params.pageSize = Number(params.pageSize || 10);
params.startRow = (currentPage - 1) * params.pageSize;
var page = {
count: 0,
rows: []
};
page.count = await this.dao.countByCondition(params);
if (page.count == 0) {
return page;
}
page.rows = await this.dao.listByCondition(params) || [];
if (page.rows) {
for (let item of page.rows) {
this.handleDate(item, ["created_at"], null, -8);
}
// await this.bmmerchantcompanyDao.setMerchantCompany(page.rows, "companyId");
}
return page;
}
}
module.exports=BmuserbizService;
module.exports = BmuserbizService;
......@@ -346,6 +346,61 @@ class xggApplet extends AppletBase {
}
}
async toAuditOrders(gobj, pobj, req) {
pobj = pobj.search || {};
try {
let params = {
pageSize: pobj.pageSize || 10,
currentPage: pobj.currentPage || 1,
audit_status: 0,
merchantId: this.merchantId,
legalName: this.trim(pobj.legalName)
};
//0待审核 1审核通过
let page = await this.bmuserbizSve.pageByCondition(params);
let result = {code : 1, data: page};
return result;
} catch (e) {
console.log(e.stack);
//日志记录
logCtl.error({
optitle: "toAuditOrders, params [" + JSON.stringify(params) + " ]",
op: "wxapplet/impl/xggApplet/toAuditOrders",
content: e.stack,
clientIp: req.clientIp
});
return {
code: -200,
msg: "error",
data: {},
stack : e.stack
};
}
}
/**
* 审核
* @param {*} gobj
* @param {*} pobj
* @param {*} req
* @param {*} loginUser
*/
async auditBiz(gobj, pobj, req, loginUser){
try {
let param = {
auditId: 1,
rejectReason:this.trim(pobj.auditReason),
auditStatus:parseInt(pobj.auditStatus),
id: this.trim(pobj.id)
}
return await this.bmorderSve.audit(param);
} catch (error) {
console.log(error);
return system.getResult(null,error);
}
}
/**
* 审核
* @param {*} gobj
......
......@@ -58,7 +58,9 @@ module.exports = function (app) {
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
// res.header('Access-Control-Allow-Credentials', 'true');
if (req.method == 'OPTIONS') {
res.header('content-type', 'text/html;charset=UTF-8');
if (req.method == 'OPTIONS') {
res.send(200); /让options请求快速返回/
}
else {
......
......@@ -115,4 +115,7 @@ module.exports = function (app) {
app.get('/supplement_hc', function (req, res) {
res.render("supplement_hc", {});
});
app.get('/audit_page', function (req, res) {
res.render("audit_page", {});
});
};
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" ">
<title id=" idtitle"> 恒昌个体户材料审核 </title>
<link rel="stylesheet" href="/css/ele/chalk.css">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fontawesome/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/autocomplete.css">
<script src="/js/vue/vue.min.js"></script>
<script src="/js/vue/vue-router.min.js"></script>
<script src="/js/vue/vuex.min.js"></script>
<script src="/js/ele/index.js"></script>
<style>
body {
padding: 0px;
margin: 0px;
}
#loading {
background-color: #2c3e50;
height: 100%;
width: 100%;
position: fixed;
z-index: 9999;
margin-top: 0px;
top: 0px;
}
#loading-center {
width: 100%;
height: 100%;
position: relative;
}
#loading-center-absolute {
position: absolute;
left: 50%;
top: 50%;
height: 50px;
width: 50px;
margin-top: -25px;
margin-left: -25px;
-ms-transform: rotate(45deg);
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
-webkit-animation: loading-center-absolute 1.5s infinite;
animation: loading-center-absolute 1.5s infinite;
}
.object {
width: 25px;
height: 25px;
background-color: #FFF;
float: left;
}
#object_one {
-webkit-animation: object_one 1.5s infinite;
animation: object_one 1.5s infinite;
}
#object_two {
-webkit-animation: object_two 1.5s infinite;
animation: object_two 1.5s infinite;
}
#object_three {
-webkit-animation: object_three 1.5s infinite;
animation: object_three 1.5s infinite;
}
#object_four {
-webkit-animation: object_four 1.5s infinite;
animation: object_four 1.5s infinite;
}
@-webkit-keyframes loading-center-absolute {
100% {
-webkit-transform: rotate(-45deg);
}
}
@keyframes loading-center-absolute {
100% {
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
}
}
@-webkit-keyframes object_one {
25% {
-webkit-transform: translate(0, -50px) rotate(-180deg);
}
100% {
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@keyframes object_one {
25% {
transform: translate(0, -50px) rotate(-180deg);
-webkit-transform: translate(0, -50px) rotate(-180deg);
}
100% {
transform: translate(0, 0) rotate(-180deg);
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@-webkit-keyframes object_two {
25% {
-webkit-transform: translate(50px, 0) rotate(-180deg);
}
100% {
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@keyframes object_two {
25% {
transform: translate(50px, 0) rotate(-180deg);
-webkit-transform: translate(50px, 0) rotate(-180deg);
}
100% {
transform: translate(0, 0) rotate(-180deg);
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@-webkit-keyframes object_three {
25% {
-webkit-transform: translate(-50px, 0) rotate(-180deg);
}
100% {
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@keyframes object_three {
25% {
transform: translate(-50px, 0) rotate(-180deg);
-webkit-transform: translate(-50px, 0) rotate(-180deg);
}
100% {
transform: translate(0, 0) rotate(-180deg);
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@-webkit-keyframes object_four {
25% {
-webkit-transform: translate(0, 50px) rotate(-180deg);
}
100% {
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
@keyframes object_four {
25% {
transform: translate(0, 50px) rotate(-180deg);
-webkit-transform: translate(0, 50px) rotate(-180deg);
}
100% {
transform: translate(0, 0) rotate(-180deg);
-webkit-transform: translate(0, 0) rotate(-180deg);
}
}
</style>
</head>
<body style="overflow: auto;">
<div id="loading">
<div id="loading-center">
<div id="loading-center-absolute">
<div class="object" id="object_one"></div>
<div class="object" id="object_two"></div>
<div class="object" id="object_three"></div>
<div class="object" id="object_four"></div>
</div>
</div>
</div>
<div id="app" 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="float:left;width: 300px;">
<span style="font-size: 14px;color: 2F2F2F;" >姓名: </span>
<el-input v-model="search.legalName" placeholder="姓名" maxlength="100" clearable style="max-width:200px;height: 36px;" ></el-input>
</div>
<div style="float:left;margin-top:5px;">
<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>
</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>
</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="legal_name" label="姓名" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="legal_mobile" label="手机号" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column prop="idcard" label="身份证" :formatter="onColFormater" align="center" ></el-table-column>
<el-table-column label="操作" align="center" >
<template slot-scope="scope">
<a href="javascript:;" @click="openAudit(scope.row)" style="text-decoration: none;color:#59C1A6;font-size: 14px;">审核</a>
</template>
</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="showAudit">
<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>
<div style="padding:0px;" >
<el-card style=" line-height: 15px;">
<span style="font-size:15px;color: #333333;font-weight:bold;margin-left: 7px;">订单信息</span>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">订单编号: {{auditItem.orderNo}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 5px;">订单状态: {{auditItem.audit_status_name}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 5px;">创建时间: {{auditItem.created_at}}</div>
</el-card>
<el-card style="line-height: 15px;margin-top: 15px;">
<span style="font-size:15px;color: #333333;font-weight:bold;margin-left: 7px;">公司信息</span>
<!-- <div style="font-size:13px;margin-left: 40px;margin-top: 10px;">公司名称: {{auditItem.companyName}}(恒昌)</div>-->
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">个体户申请名称: {{auditItem.companyNames}}</div>
</el-card>
<el-card style="line-height: 15px;margin-top: 15px;">
<span style="font-size:15px;color: #333333;font-weight:bold;margin-left: 7px;">法人信息</span>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">法人姓名: {{auditItem.legal_name}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">联系方式: {{auditItem.legal_mobile}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">身份证号: {{auditItem.idcard}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">
身份证图:
<div style="margin-left: 70px;">
<img style="width: 80px;height:80px;cursor: pointer;" :src="auditItem.idcard_front" alt @click="topic_preview('idcard_front')" />
<img style="width: 80px;height:80px;cursor: pointer;margin-left: 10px;" :src="auditItem.idcard_back" alt @click="topic_preview('idcard_back')" />
</div>
</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">
半身照:
<div style="margin-left: 70px;">
<img style="width: 80px;cursor: pointer;height:80px;" :src="auditItem.front_half_img" alt @click="topic_preview('front_half_img')" />
</div>
</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">
声明书:
<div style="margin-left: 70px;">
<img style="width: 80px;cursor: pointer;" :src="auditItem.declaration_file" alt @click="topic_preview('declaration_file')" />
</div>
</div>
</el-card>
<el-card style="line-height: 15px;margin-top: 15px;">
<span style="font-size:15px;color: #333333;font-weight:bold;margin-left: 7px;">银行卡信息</span>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">开 户 行: {{auditItem.bank}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">银行卡号: {{auditItem.bankno}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">预留手机号: {{auditItem.bankMobile}}</div>
<div style="font-size:13px;margin-left: 40px;margin-top: 10px;">
照片:
<div style="margin-left: 70px;">
<img style="width: 80px;height:80px;cursor: pointer;" :src="auditItem.bank_back" alt @click="topic_preview('bank_back')" />
<img style="width: 80px;height:80px;cursor: pointer;margin-left: 10px;" :src="auditItem.bank_front" alt @click="topic_preview('bank_front')" />
</div>
</div>
</el-card>
<el-card style="line-height: 15px;margin-top: 15px;">
<span style="font-size:15px;color: #333333;font-weight:bold;margin-left: 7px;">审核结果</span>
<el-input
type="textarea"
:rows="3"
placeholder="输入审核内容"
style="padding: 5px;margin-top: 15px;"
v-model="auditReason">
</el-input>
<div style="margin-left: 200px;margin-top: 10px;">
<el-button :loading="auditLoading" @click="saveAudit('1')" style="width:120px;height:36px; background:#54C4A7; border-radius:4px;color: #FFFFFF;font-size: 16px;padding-top: 10px;">通过</el-button>
<el-button :loading="auditLoading" @click="saveAudit('2')" style="width:120px;height:36px; background:#54C4A7; border-radius:4px;color: #FFFFFF;font-size: 16px;padding-top: 10px;">驳回</el-button>
</div>
</el-card>
</div>
</el-dialog>
</div>
<script src="/js/vue/jquery.min.js"></script>
<script src="/js/vue/base64.js"></script>
<script src="/js/vue/axios.min.js"></script>
<script src="/js/audit_page.js"></script>
</html>
var app = new Vue({
el: "#app",
data: function () {
return {
btnloading: false,
uploadLoading: null,
showAudit: false,
auditLoading: false,
search: {
list: [],
currentPage: 1,
pageSize: 20,
total : 0,
legalName:'',
},
auditItem: {},
auditReason: "",
}
},
created: function () {
},
mounted: function () {
$("#loading").fadeOut();
this.opSearch();
},
methods: {
postReq(path, data) {
return axios.post(path, data).then(function (r) {
return r.data ? r.data : null;
})
},
resetSearch() {
this.search = this.getEmptySearch();
this.getList();
},
getEmptySearch() {
return {
list: [],
currentPage: 1,
pageSize: 20,
total : 0,
legalName:'',
}
},
getParams() {
var params = {};
for(var f in this.search) {
if(f == "list") {
continue;
}
params[f] = this.search[f];
}
return params;
},
opSearch() {
this.search.currentPage = 1;
this.search.total = 0;
this.getList();
},
getList() {
var self = this;
var params = this.getParams();
this.$root.postReq("/applet/xggApplet/toAuditOrders", {
search: params
}).then(function (d) {
if (d.code == 1) {
self.search.list = d.data.rows || [];
self.search.total = d.data.count || 0;
} else {
}
});
},
btnclick (pfm, code) {
},
openAudit(item) {
console.log(item);
this.auditItem = item;
if (item.audit_status == 0) {
item.audit_status_name = "待审核";
} else if (item.audit_status == 1) {
item.audit_status_name = "审核通过";
} else {
item.audit_status_name = "审核驳回";
}
if (item.companyId == 1) {
item.companyName = "汇财"
} else if(item.companyId == 2) {
item.companyName = "张舟怡帆---北京"
} else {
item.companyName = "网众共创---北京"
}
item.companyNames = item.companyNames.split("#com#").join(",");
this.auditReason = "";
this.auditLoading = false;
this.showAudit = true;
},
saveAudit(auditStatus) {
var self = this;
self.auditLoading = true;
if (auditStatus == 2 && (!this.auditReason || !this.auditReason.trim())) {
self.auditLoading = false;
self.$message.warning("请输入驳回原因");
return;
}
var auditParam = {
auditStatus: auditStatus,
auditReason: this.auditReason,
id: this.auditItem.orderId
};
// 处理审核
self.$root.postReq("/applet/xggApplet/auditBiz", auditParam).then(function(d){
console.log(d);
if (d.code == 1) {
self.showAudit = false;
self.getList();
self.$message.success("审核成功");
self.auditItem = {};
} else {
self.$message.warning(d.msg || "审核成功, 请稍候重试");
}
self.auditLoading = false;
});
},
topic_preview(filed) {
let url = this.auditItem[filed || ""];
if(url) {
window.open(url);
} else {
this.$message.warning("未上传");
}
},
onColFormater(row, column, cellValue, index) {
return cellValue || "---";
},
handleSizeChange(val) {
this.search.pageSize = val;
this.resetSearch();
},
handleCurrentChange(val) {
this.search.currentPage = val;
this.getList();
},
demofunction() {
},
},
});
\ No newline at end of file
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