Files
zszq-trs/YLErpWeb/Views/clientblack/clientblacklist.cshtml
T
tengyufan 8afd449c40 feat(ClientBlack): 新增客户黑名单审批流程
- 黑名单新增、删除、批量导入、批量移出在配置审批节点后,审批通过才生效
- 新增黑名单待提交后可提交审批;仅首节点未审批时可撤回,进入后续节点禁止撤回
- 增加黑名单审批列表、审批弹窗、审批操作日志及状态筛选
- 支持审批配置中的“黑名单审批”流程及对应菜单、模块权限、操作权限
- 黑名单审批中禁止同名记录覆盖备注;已在黑名单中的同名导入会明确提示本次将修改备注
- 未配置审批节点时保持原有直接生效行为
- 增加黑名单审批状态机单测,39/39 通过
- 修正撤回全部失败时仍提示“撤回审批成功”的问题
2026-08-13 17:21:04 +08:00

305 lines
12 KiB
Plaintext

@{
ViewBag.Title = "客户黑名单列表";
Layout = "~/Views/Shared/_MainLayout.cshtml";
var pageObj = new
{
canEdit = CurUser.客户管理.黑名单客户管理,
ViewTagPermission = CurUser.客户管理.客户标签查看权限,
};
}
@section CSS{
<link href="~/Style/Css/clientsettag.css?v=@(HtmlUtil.JsVersion)" rel="stylesheet" />
<style>
.tag-item {
height: 17px;
line-height: 14px;
}
.tag-add {
height: 17px;
line-height: 14px;
}
.tag-context {
padding: 0px;
}
</style>
}
@section JS{
<script type="text/javascript">
var page = @Json.Serialize(pageObj);
var g_grid = {};
$(function () {
var PostData = {};
@Html.Raw(JqGridSimple.OutGrid("/clientblack/clientblacklistQuery",true));
g_grid = jQuery('#listGrid');
function keyEnter(event) {
try {
var e = event ? event : (window.event ? window.event : null);
(e.keyCode == 13) &&SearchClick(true);
} catch (e) {}
}
document.onkeydown = keyEnter;
//SetAceDropDown();
});
var colModelGrid = [{
name: 'id', label: 'id', index: 'id', width: 0, hidden: true, optionHide: true
}, {
name: 'opt', label: '操作', index: 'opt', width: 200, align: 'left', hidden: !page.canEdit, optionHide: !page.canEdit, sortable: false,
formatter: function (cellValue, options, rowObject) {
if (page.canEdit) {
var html = ("<input type=\"button\" class=\"wentiEdit\" onclick=\"clientblackLogView('{0}');return false;\" value=\"查看\" /><input type=\"button\" class=\"wentiEdit\" onclick=\"startAddclientblack('{0}');return false;\" value=\"设置\" /><input type=\"button\" class=\"wentiEdit\" onclick=\"ClientBlackDeleteRow('{0}');return false;\" value=\"删除\" />")
.template(rowObject.id);
return html;
}
else {
return "";
}
}
}, {
name: 'Name', label: '客户名称', index: 'Name', width: 260
}, {
name: 'Remarks', label: '备注', index: 'Remarks', width: 500
}, {
name: 'State', label: '状态', index: 'State', width: 120
}, {
name: 'OptName', label: '操作人', index: 'OptName', width: 150
}, {
name: 'OptDate', label: '操作时间', index: 'OptDate', width: 200
},];
if (page.ViewTagPermission) {
colModelGrid.push({
name: 'Tags',
label: '标签值',
index: 'Tags',
width: 400,
formatter:tagformat,
align: 'left',
sortable: false
}, {
name: 'OutputTags',
label: 'OutputTags',
index: 'OutputTags',
width: 70,
align: 'center',
hidden: true,
optionHide: true
});
}
function tagformat(cellvalue, options, rowObject) {
var html = '<div class="tag-context">';
var tagNames = "";
if (rowObject.Tags != null && rowObject.Tags.length > 0) {
for (var i = 0; i < rowObject.Tags.length; i++) {
if (i == rowObject.Tags.length - 1) {
tagNames += "[" + rowObject.Tags[i].Name + "]";
} else {
tagNames += "[" + rowObject.Tags[i].Name + "],";
}
}
if (rowObject.Tags.length > 4) {
for (var i = 0; i < 4; i++) {
html += '<span class="tag-item" data-id="' + rowObject.Tags[i].Id + '" data-name="' + rowObject.Tags[i].Name + '"><span class="tag-text" data-value="' + rowObject.Tags[i].Id + '">' + rowObject.Tags[i].Name + '</span></span>';
}
html += '<span class="tag-add" title="' + tagNames + '">...</span>';
} else {
for (var i = 0; i < rowObject.Tags.length; i++) {
html += '<span class="tag-item" data-id="' + rowObject.Tags[i].Id + '" data-name="' + rowObject.Tags[i].Name + '"><span class="tag-text" data-value="' + rowObject.Tags[i].Id + '">' + rowObject.Tags[i].Name + '</span></span>';
}
}
}
html += '</div>';
return html;
}
function reloadclient_black() {
//重新加载
SearchClick();
}
/*导出点击事件*/
function ExportClientBlack() {
let ggrid = $('#listGrid');
let postData = { ids: main.GetGridIds(ggrid), ...ggrid.getPostData() };
var $form = $('#exportForm').html('');
$form.attr("action", '/clientblack/ExportClientBlack')
_.each(postData, (val, key) => {
if (!val) {
val = '';
} else if (_.isArray(val)) {
_.each(val, x => {
$form.append(`<input type="hidden" name="${key}" value="${x}">`);
});
return;
}
$form.append(`<input type="hidden" name="${key}" value="${val}">`);
});
$form.submit();
}
function SearchClick(isSearchclick) {
var listGrid = $('#listGrid');
listGrid.appendPostData({ Name: $("#Name").val() });
listGrid.appendPostData({ ClientBlackStates: $("#ClientBlackStates").val()?.join(',') || '' });
if (typeof (isSearchclick) != "undefined" && isSearchclick) {
//点击搜索时默认第一页
listGrid.jqGrid('setGridParam', {page: 1});
}
listGrid.trigger('reloadGrid');
}
function startAddclientblack(id) {
var addurl = "/clientblack/clientblackAdd?id="+id;
main.infopage(id?"修改信息": "新增客户", addurl, { area: ['500px', '300px'] });
}
function uploadSettlementBill() {
layer.open({
type: 1,
title: '黑名单客户导入',
content: $('#uploadTpl').html(),
area: ["500px", "200px"]
});
}
function importDatas() {
if (!checkSubmitData()) return;
var formData = new FormData($('#formImport')[0]);
main.post('/clientblack/UploadSettlementBill?checkStatus=true', formData, {
success: function (res) {
if (!res.success) {
if (res.msg.indexOf("备注已存在") >= 0) {
main.confirm(res.msg, function () {
main.post("/clientblack/UploadSettlementBill?checkStatus=false", formData).done(function (res) {
SearchClick();
layer.closeAll();
})
});
} else {
main.alert(res.msg);
}
}
else {
main.message("导入成功");
SearchClick();
layer.closeAll();
}
},
error: function (msg) {
alert("error:" + msg);
}
});
}
function checkSubmitData() {
//非xlsx文件不允许用户导入
var fileName = $('#openFile').val();
if (fileName == "") {
main.message("请选择文件!");
return false;
}
var arr = "xlsx";
var index = fileName.lastIndexOf(".");
var ext = fileName.substr(index + 1);
if (ext == arr) {
return true;
}
else {
parent.main.message("请导入xlsx格式文件!");
}
return true;
}
function ClientBlackDelete() {
var ggrid = jQuery('#listGrid');
var ors = main.GetGridIds(ggrid);
if (ors.length <= 0) {
main.message("请选择要移除的数据!");
return;
}
main.confirm("确认删除吗?", function () {
var ids = ors.toString();
main.post('/clientblack/DeleteClientBlack', { ids: ids }, {
}).done(function (data) {
SearchClick();
layer.closeAll();
});
})
}
function ClientBlackDeleteRow(id) {
main.confirm("确认删除吗?", function () {
main.post('/clientblack/DeleteClientBlack', { ids: id }, {
}).done(function (data) {
SearchClick();
layer.closeAll();
});
})
}
function ClientBlackSubmit() {
var ids = main.GetGridIds($('#listGrid'));
if (!ids.length) { main.message('请选择要提交的数据!'); return; }
main.post('/clientblack/clientblackSubmit', { ids: ids.toString() }).done(function () { SearchClick(); });
}
function ClientBlackWithdraw() {
var ids = main.GetGridIds($('#listGrid'));
if (!ids.length) { main.message('请选择要撤回的数据!'); return; }
main.post('/clientblack/clientblackWithdraw', { ids: ids.toString() }).done(function () { SearchClick(); });
}
function clientblackLogView(id) {
main.open('操作历史', '/clientblack/clientblackLogList?id=' + id, { area: ['1000px', '75%'] });
}
</script>
}
<form target="_blank" method="post" id="exportForm" action="">
<input type="hidden" name="" value="" />
</form>
<script type="text/html" id="uploadTpl">
<div class="container" style="overflow:hidden;padding:20px;">
<form class="form-horizontal" method="post" id="formImport" onsubmit="return false;">
<div>
<input type="file" id="openFile" name="file" accept="text/csv" />
</div>
<div style="margin: 0px auto; padding: 10px;">
<input class="btn btn-primary" type="button" onclick="importDatas();return false;" value="导入黑名单客户" />
<a class="btn btn-primary" href="/download/ImportTemplate/黑名单客户模板" target="_blank">黑名单客户模板下载</a>
<input class="btn btn-primary" type="button" onclick="layer.closeAll();return false;" value="关闭" />
</div>
</form>
</div>
</script>
<div class="searchdiv">
<form class="form-inline search-form" onsubmit="return false;" autocomplete="off">
<label>客户名称</label>
<input type="text" name="Name" id="Name" maxlength="50" />
@Html.MyAceDropdownInput("ClientBlackStates", "状态", clientblackController.GetClientBlackStates())
<button type="button" class="btn btn-primary" onclick="return(SearchClick(true));"><span class="glyphicon glyphicon-search"></span> 查询</button>
@if (CurUser.客户管理.黑名单客户管理)
{
<button type="button" class="btn btn-primary" onclick="startAddclientblack();">新增</button>
<button type="button" class="btn btn-primary" onclick="uploadSettlementBill();">批量导入</button>
<button type="button" class="btn btn-primary" onclick="ExportClientBlack();">批量导出</button>
<button type="button" class="btn btn-primary" onclick="ClientBlackDelete();">批量移除</button>
}
@if (CurUser.客户管理.黑名单客户提交审批)
{
<button type="button" class="btn btn-primary" onclick="ClientBlackSubmit();">提交审批</button>
}
@if (CurUser.客户管理.黑名单客户撤回提交审批)
{
<button type="button" class="btn btn-primary" onclick="ClientBlackWithdraw();">撤回审批</button>
}
</form>
</div>
@Html.Raw(JqGridSimple.OutTable())