Compare commits

..

3 Commits

32 changed files with 585 additions and 229 deletions

View File

@ -1,23 +0,0 @@
<!doctype html><html lang="zh"><head data-built-info="@cqsjjb/scripts@2.0.0-alpha-1 Env/production (2025/10/17 11:07:53) App/risk"><meta charset="UTF-8"/><meta name="renderer" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/><meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"><title>--</title><script>(function () {
const APP_ENV = {
antd: {
'ant-prefix': 'micro-temp',
fontFamily: 'PingFangSC-Regular',
colorPrimary: '#1677ff',
borderRadius: parseInt('2')
},
appKey: '',
basename: 'risk',
API_HOST: ''
};
APP_ENV.API_HOST = sessionStorage.API_HOST || APP_ENV.API_HOST || window.location.origin;
window.process = {
env: { app: APP_ENV },
NODE_ENV: 'production'
};
window.__JJB_ENVIRONMENT__ = {
API_HOST: APP_ENV.API_HOST,
redirect: '',
FRAMEWORK: APP_ENV.antd
};
})();</script><script defer="defer" src="/risk/static/js/295.21df88c875577274cecb.js"></script><script defer="defer" src="/risk/static/js/main.4c0885586ad9a06ab444.js"></script><link href="/risk/static/css/main.40fc518bb0818fe8b8ea.css" rel="stylesheet"></head><body style="overflow: hidden"><noscript>此网页需要开启JavaScript功能。</noscript><div id="root" style="width: 100%; height: 100%; position: relative"></div><script type="text/javascript">/* @cqsjjb/script 输出当前应用基本信息、构建时间 */console.log("%c@cqsjjb/scripts@2.0.0-alpha-1 Env/production (2025/10/17 11:07:53) App/risk Version/master Java/<branch-name>", "color: #1890ff; border-radius: 2px; padding: 0 4px; border: 1px solid #1890ff; background: #f9fcff")</script></body></html>

View File

@ -1 +0,0 @@
body,html{height:100%;width:100%}input::-ms-clear,input::-ms-reveal{display:none}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}body{margin:0}[tabindex="-1"]:focus{outline:none}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{font-weight:500;margin-bottom:.5em;margin-top:0}p{margin-bottom:1em;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1em}input[type=number],input[type=password],input[type=text],textarea{-webkit-appearance:none}dl,ol,ul{margin-bottom:1em;margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}pre{margin-bottom:1em;margin-top:0;overflow:auto}figure{margin:0 0 1em}img{border-style:none;vertical-align:middle}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{touch-action:manipulation}table{border-collapse:collapse}caption{caption-side:bottom;padding-bottom:.3em;padding-top:.75em;text-align:left}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5em;line-height:inherit;margin-bottom:.5em;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{background-color:#feffe6;padding:.2em}

View File

@ -1 +0,0 @@
module.exports={compact:!1,plugins:[["@babel/plugin-proposal-decorators",{legacy:!0}]],presets:[["@babel/preset-env",{targets:{browsers:["ie >= 10"]}}],["@babel/preset-react",{runtime:"automatic"}]]};

View File

@ -1 +0,0 @@
module.exports={javaGit:"<git-url>",javaGitName:"<git-name>",environment:{development:{javaGitBranch:"<branch-name>",API_HOST:"http://192.168.20.100:30140/demo2"},production:{javaGitBranch:"<branch-name>",API_HOST:""}},appIdentifier:"risk",contextInject:{appKey:""},windowInject:{title:"微应用模板",links:[],element:{root:{id:"root"}},scripts:[]},server:{port:"8080",host:"127.0.0.1",open:!0},framework:{antd:{"ant-prefix":"micro-temp",fontFamily:"PingFangSC-Regular",colorPrimary:"#1677ff",borderRadius:2}},webpackConfig:{htmlWebpackPluginOption:{inject:!0}}};

File diff suppressed because one or more lines are too long

View File

@ -1,135 +0,0 @@
/*!
Copyright (c) 2018 Jed Watson.
Licensed under the MIT License (MIT), see
http://jedwatson.github.io/classnames
*/
/*!
* is-plain-object <https://github.com/jonschlinkert/is-plain-object>
*
* Copyright (c) 2014-2017, Jon Schlinkert.
* Released under the MIT License.
*/
/*!
* isobject <https://github.com/jonschlinkert/isobject>
*
* Copyright (c) 2014-2017, Jon Schlinkert.
* Released under the MIT License.
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v17.0.2
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @preserve
* Counter block mode compatible with Dr Brian Gladman fileenc.c
* derived from CryptoJS.mode.CTR
* Jan Hruby jhruby.web@gmail.com
*/
/** @preserve
(c) 2012 by Cédric Mesnil. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**![caret-down](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg0MC40IDMwMEgxODMuNmMtMTkuNyAwLTMwLjcgMjAuOC0xOC41IDM1bDMyOC40IDM4MC44YzkuNCAxMC45IDI3LjUgMTAuOSAzNyAwTDg1OC45IDMzNWMxMi4yLTE0LjIgMS4yLTM1LTE4LjUtMzV6IiAvPjwvc3ZnPg==) */
/**![caret-up](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg1OC45IDY4OUw1MzAuNSAzMDguMmMtOS40LTEwLjktMjcuNS0xMC45LTM3IDBMMTY1LjEgNjg5Yy0xMi4yIDE0LjItMS4yIDM1IDE4LjUgMzVoNjU2LjhjMTkuNyAwIDMwLjctMjAuOCAxOC41LTM1eiIgLz48L3N2Zz4=) */
/**![check](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTkxMiAxOTBoLTY5LjljLTkuOCAwLTE5LjEgNC41LTI1LjEgMTIuMkw0MDQuNyA3MjQuNSAyMDcgNDc0YTMyIDMyIDAgMDAtMjUuMS0xMi4ySDExMmMtNi43IDAtMTAuNCA3LjctNi4zIDEyLjlsMjczLjkgMzQ3YzEyLjggMTYuMiAzNy40IDE2LjIgNTAuMyAwbDQ4OC40LTYxOC45YzQuMS01LjEuNC0xMi44LTYuMy0xMi44eiIgLz48L3N2Zz4=) */
/**![double-left](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTI3Mi45IDUxMmwyNjUuNC0zMzkuMWM0LjEtNS4yLjQtMTIuOS02LjMtMTIuOWgtNzcuM2MtNC45IDAtOS42IDIuMy0xMi42IDYuMUwxODYuOCA0OTIuM2EzMS45OSAzMS45OSAwIDAwMCAzOS41bDI1NS4zIDMyNi4xYzMgMy45IDcuNyA2LjEgMTIuNiA2LjFINTMyYzYuNyAwIDEwLjQtNy43IDYuMy0xMi45TDI3Mi45IDUxMnptMzA0IDBsMjY1LjQtMzM5LjFjNC4xLTUuMi40LTEyLjktNi4zLTEyLjloLTc3LjNjLTQuOSAwLTkuNiAyLjMtMTIuNiA2LjFMNDkwLjggNDkyLjNhMzEuOTkgMzEuOTkgMCAwMDAgMzkuNWwyNTUuMyAzMjYuMWMzIDMuOSA3LjcgNi4xIDEyLjYgNi4xSDgzNmM2LjcgMCAxMC40LTcuNyA2LjMtMTIuOUw1NzYuOSA1MTJ6IiAvPjwvc3ZnPg==) */
/**![double-right](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUzMy4yIDQ5Mi4zTDI3Ny45IDE2Ni4xYy0zLTMuOS03LjctNi4xLTEyLjYtNi4xSDE4OGMtNi43IDAtMTAuNCA3LjctNi4zIDEyLjlMNDQ3LjEgNTEyIDE4MS43IDg1MS4xQTcuOTggNy45OCAwIDAwMTg4IDg2NGg3Ny4zYzQuOSAwIDkuNi0yLjMgMTIuNi02LjFsMjU1LjMtMzI2LjFjOS4xLTExLjcgOS4xLTI3LjkgMC0zOS41em0zMDQgMEw1ODEuOSAxNjYuMWMtMy0zLjktNy43LTYuMS0xMi42LTYuMUg0OTJjLTYuNyAwLTEwLjQgNy43LTYuMyAxMi45TDc1MS4xIDUxMiA0ODUuNyA4NTEuMUE3Ljk4IDcuOTggMCAwMDQ5MiA4NjRoNzcuM2M0LjkgMCA5LjYtMi4zIDEyLjYtNi4xbDI1NS4zLTMyNi4xYzkuMS0xMS43IDkuMS0yNy45IDAtMzkuNXoiIC8+PC9zdmc+) */
/**![ellipsis](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE3NiA1MTFhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMTAtMTEyIDB6bTI4MCAwYTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDEwLTExMiAwem0yODAgMGE1NiA1NiAwIDEwMTEyIDAgNTYgNTYgMCAxMC0xMTIgMHoiIC8+PC9zdmc+) */
/**![eye](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk0Mi4yIDQ4Ni4yQzg0Ny40IDI4Ni41IDcwNC4xIDE4NiA1MTIgMTg2Yy0xOTIuMiAwLTMzNS40IDEwMC41LTQzMC4yIDMwMC4zYTYwLjMgNjAuMyAwIDAwMCA1MS41QzE3Ni42IDczNy41IDMxOS45IDgzOCA1MTIgODM4YzE5Mi4yIDAgMzM1LjQtMTAwLjUgNDMwLjItMzAwLjMgNy43LTE2LjIgNy43LTM1IDAtNTEuNXpNNTEyIDc2NmMtMTYxLjMgMC0yNzkuNC04MS44LTM2Mi43LTI1NEMyMzIuNiAzMzkuOCAzNTAuNyAyNTggNTEyIDI1OGMxNjEuMyAwIDI3OS40IDgxLjggMzYyLjcgMjU0Qzc5MS41IDY4NC4yIDY3My40IDc2NiA1MTIgNzY2em0tNC00MzBjLTk3LjIgMC0xNzYgNzguOC0xNzYgMTc2czc4LjggMTc2IDE3NiAxNzYgMTc2LTc4LjggMTc2LTE3Ni03OC44LTE3Ni0xNzYtMTc2em0wIDI4OGMtNjEuOSAwLTExMi01MC4xLTExMi0xMTJzNTAuMS0xMTIgMTEyLTExMiAxMTIgNTAuMSAxMTIgMTEyLTUwLjEgMTEyLTExMiAxMTJ6IiAvPjwvc3ZnPg==) */
/**![file](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg1NC42IDI4OC42TDYzOS40IDczLjRjLTYtNi0xNC4xLTkuNC0yMi42LTkuNEgxOTJjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjgzMmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg2NDBjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzExLjNjMC04LjUtMy40LTE2LjctOS40LTIyLjd6TTc5MC4yIDMyNkg2MDJWMTM3LjhMNzkwLjIgMzI2em0xLjggNTYySDIzMlYxMzZoMzAydjIxNmE0MiA0MiAwIDAwNDIgNDJoMjE2djQ5NHoiIC8+PC9zdmc+) */
/**![filter](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM0OSA4MzhjMCAxNy43IDE0LjIgMzIgMzEuOCAzMmgyNjIuNGMxNy42IDAgMzEuOC0xNC4zIDMxLjgtMzJWNjQySDM0OXYxOTZ6bTUzMS4xLTY4NEgxNDMuOWMtMjQuNSAwLTM5LjggMjYuNy0yNy41IDQ4bDIyMS4zIDM3NmgzNDguOGwyMjEuMy0zNzZjMTIuMS0yMS4zLTMuMi00OC0yNy43LTQ4eiIgLz48L3N2Zz4=) */
/**![folder-open](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTkyOCA0NDRIODIwVjMzMC40YzAtMTcuNy0xNC4zLTMyLTMyLTMySDQ3M0wzNTUuNyAxODYuMmE4LjE1IDguMTUgMCAwMC01LjUtMi4ySDk2Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY1OTJjMCAxNy43IDE0LjMgMzIgMzIgMzJoNjk4YzEzIDAgMjQuOC03LjkgMjkuNy0yMGwxMzQtMzMyYzEuNS0zLjggMi4zLTcuOSAyLjMtMTIgMC0xNy43LTE0LjMtMzItMzItMzJ6TTEzNiAyNTZoMTg4LjVsMTE5LjYgMTE0LjRINzQ4VjQ0NEgyMzhjLTEzIDAtMjQuOCA3LjktMjkuNyAyMEwxMzYgNjQzLjJWMjU2em02MzUuMyA1MTJIMTU5bDEwMy4zLTI1Nmg2MTIuNEw3NzEuMyA3Njh6IiAvPjwvc3ZnPg==) */
/**![folder](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg4MCAyOTguNEg1MjFMNDAzLjcgMTg2LjJhOC4xNSA4LjE1IDAgMDAtNS41LTIuMkgxNDRjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjU5MmMwIDE3LjcgMTQuMyAzMiAzMiAzMmg3MzZjMTcuNyAwIDMyLTE0LjMgMzItMzJWMzMwLjRjMC0xNy43LTE0LjMtMzItMzItMzJ6TTg0MCA3NjhIMTg0VjI1NmgxODguNWwxMTkuNiAxMTQuNEg4NDBWNzY4eiIgLz48L3N2Zz4=) */
/**![holder](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMwMCAyNzYuNWE1NiA1NiAwIDEwNTYtOTcgNTYgNTYgMCAwMC01NiA5N3ptMCAyODRhNTYgNTYgMCAxMDU2LTk3IDU2IDU2IDAgMDAtNTYgOTd6TTY0MCAyMjhhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMDAtMTEyIDB6bTAgMjg0YTU2IDU2IDAgMTAxMTIgMCA1NiA1NiAwIDAwLTExMiAwek0zMDAgODQ0LjVhNTYgNTYgMCAxMDU2LTk3IDU2IDU2IDAgMDAtNTYgOTd6TTY0MCA3OTZhNTYgNTYgMCAxMDExMiAwIDU2IDU2IDAgMDAtMTEyIDB6IiAvPjwvc3ZnPg==) */
/**![left](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcyNCAyMTguM1YxNDFjMC02LjctNy43LTEwLjQtMTIuOS02LjNMMjYwLjMgNDg2LjhhMzEuODYgMzEuODYgMCAwMDAgNTAuM2w0NTAuOCAzNTIuMWM1LjMgNC4xIDEyLjkuNCAxMi45LTYuM3YtNzcuM2MwLTQuOS0yLjMtOS42LTYuMS0xMi42bC0zNjAtMjgxIDM2MC0yODEuMWMzLjgtMyA2LjEtNy43IDYuMS0xMi42eiIgLz48L3N2Zz4=) */
/**![minus-square](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMyOCA1NDRoMzY4YzQuNCAwIDgtMy42IDgtOHYtNDhjMC00LjQtMy42LTgtOC04SDMyOGMtNC40IDAtOCAzLjYtOCA4djQ4YzAgNC40IDMuNiA4IDggOHoiIC8+PHBhdGggZD0iTTg4MCAxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDcyOEgxODRWMTg0aDY1NnY2NTZ6IiAvPjwvc3ZnPg==) */
/**![plus-square](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMyOCA1NDRoMTUydjE1MmMwIDQuNCAzLjYgOCA4IDhoNDhjNC40IDAgOC0zLjYgOC04VjU0NGgxNTJjNC40IDAgOC0zLjYgOC04di00OGMwLTQuNC0zLjYtOC04LThINTQ0VjMyOGMwLTQuNC0zLjYtOC04LThoLTQ4Yy00LjQgMC04IDMuNi04IDh2MTUySDMyOGMtNC40IDAtOCAzLjYtOCA4djQ4YzAgNC40IDMuNiA4IDggOHoiIC8+PHBhdGggZD0iTTg4MCAxMTJIMTQ0Yy0xNy43IDAtMzIgMTQuMy0zMiAzMnY3MzZjMCAxNy43IDE0LjMgMzIgMzIgMzJoNzM2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE0NGMwLTE3LjctMTQuMy0zMi0zMi0zMnptLTQwIDcyOEgxODRWMTg0aDY1NnY2NTZ6IiAvPjwvc3ZnPg==) */
/**![right](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTc2NS43IDQ4Ni44TDMxNC45IDEzNC43QTcuOTcgNy45NyAwIDAwMzAyIDE0MXY3Ny4zYzAgNC45IDIuMyA5LjYgNi4xIDEyLjZsMzYwIDI4MS4xLTM2MCAyODEuMWMtMy45IDMtNi4xIDcuNy02LjEgMTIuNlY4ODNjMCA2LjcgNy43IDEwLjQgMTIuOSA2LjNsNDUwLjgtMzUyLjFhMzEuOTYgMzEuOTYgMCAwMDAtNTAuNHoiIC8+PC9zdmc+) */

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */

View File

@ -1,44 +0,0 @@
{
"name": "micro-app",
"version": "2.0.0",
"description": "建教帮微应用模板",
"author": "JJB",
"license": "MIT",
"main": "index.js",
"scripts": {
"serve": "node node_modules/@cqsjjb/scripts/webpack.dev.server.js",
"build": "node node_modules/@cqsjjb/scripts/webpack.build.js",
"push": "jjb-cmd push java production",
"clean-cache": "rimraf node_modules/.cache/webpack",
"serve:development": "cross-env NODE_ENV=development npm run serve",
"serve:production": "cross-env NODE_ENV=production npm run serve",
"build:development": "cross-env NODE_ENV=development npm run build",
"build:production": "cross-env NODE_ENV=production npm run build",
"code-optimization": "node node_modules/@cqsjjb/scripts/code-optimization.js",
"lint": "eslint --ext .js,.jsx,.tsx --fix src"
},
"dependencies": {
"@ant-design/icons": "latest",
"@cqsjjb/jjb-common-decorator": "latest",
"@cqsjjb/jjb-common-lib": "latest",
"@cqsjjb/jjb-dva-runtime": "latest",
"@cqsjjb/jjb-react-admin-component": "latest",
"ahooks": "^3.9.5",
"antd": "latest",
"dayjs": "^1.11.7",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@antfu/eslint-config": "^5.4.1",
"@babel/plugin-proposal-decorators": "^7.19.3",
"@cqsjjb/scripts": "latest",
"@eslint-react/eslint-plugin": "^2.2.2",
"cross-env": "^7.0.3",
"eslint": "^9.37.0",
"eslint-plugin-format": "^1.0.2",
"eslint-plugin-react-hooks": "^7.0.0",
"eslint-plugin-react-refresh": "^0.4.23",
"typescript": "^5.9.3"
}
}

View File

@ -1,21 +1,36 @@
package com.zcloud.edu.web.study;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.api.study.StudentServiceI;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.study.*;
import com.zcloud.edu.dto.clientobject.study.StudentCountByCorpCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountByCorpCO;
import com.zcloud.edu.dto.study.EducationUserQry;
import com.zcloud.edu.dto.study.StudentAddCmd;
import com.zcloud.edu.dto.study.StudentCountByCorpQry;
import com.zcloud.edu.dto.study.StudentCountQry;
import com.zcloud.edu.dto.study.StudentExamCountQry;
import com.zcloud.edu.dto.study.StudentExamCountByCorpQry;
import com.zcloud.edu.dto.study.StudentPageQry;
import com.zcloud.edu.dto.study.StudentUpdateCmd;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@ -26,7 +41,7 @@ import java.util.List;
* @Author zhangyue
* @Date 2026-01-13 14:18:14
*/
@Api(tags = "班级信息")
@Api(tags = "学员信息")
@RequestMapping("/${application.gateway}/student")
@RestController
@AllArgsConstructor
@ -36,8 +51,6 @@ public class StudentController {
@ApiOperation("新增")
@PostMapping("/save")
public SingleResponse<StudentCO> add(@Validated @RequestBody List<StudentAddCmd> cmdList) {
System.out.println(cmdList);
SSOUser ssoUser = AuthContext.getCurrentUser();
return studentService.add(cmdList);
}
@ -53,7 +66,7 @@ public class StudentController {
return studentService.educationUserList(qry);
}
@ApiOperation("获取可推送三方人员")
@ApiOperation("获取可推送三方人员")
@PostMapping("/pushCandidateUserList")
public PageResponse<EducationUserCO> pushCandidateUserList(@RequestBody EducationUserQry qry) {
return studentService.pushCandidateUserList(qry);
@ -74,7 +87,7 @@ public class StudentController {
@ApiOperation("所有数据")
@GetMapping("/listAll")
public MultiResponse<StudentCO> listAll() {
return MultiResponse.of(new ArrayList<StudentCO>());
return MultiResponse.of(new ArrayList<>());
}
@ApiOperation("查询用户统计")
@ -127,4 +140,24 @@ public class StudentController {
studentService.edit(studentUpdateCmd);
return SingleResponse.buildSuccess();
}
@ApiOperation("考试人数统计-企业端首页")
@PostMapping("/listExamCount")
public MultiResponse<StudentExamCountCO> listExamCount(@RequestBody StudentExamCountQry qry) {
return studentService.listExamCount(qry);
}
@ApiOperation("考试人数统计-监管端首页企业列表")
@PostMapping("/listExamCountByCorp")
public MultiResponse<StudentExamCountByCorpCO> listExamCountByCorp(@RequestBody StudentExamCountByCorpQry qry) {
return studentService.listExamCountByCorp(qry);
}
@ApiOperation("考试人数统计-查询用户统计-相关方首页")
@PostMapping("/listStudentCountByCorp")
public MultiResponse<StudentCountByCorpCO> listStudentCountByCorp(@RequestBody StudentCountByCorpQry qry) {
return studentService.listStudentCountByCorp(qry);
}
}

View File

@ -50,11 +50,19 @@ public class ClassCurriculumQueryExe {
Map<String, Object> params = PageQueryHelper.toHashMap(classCurriculumPageQry);
PageResponse<ClassCurriculumDO> pageResponse = classCurriculumRepository.listPage(params);
List<ClassCurriculumCO> examCenterCOS = classCurriculumCoConvertor.converDOsToCOs(pageResponse.getData());
examCenterCOS.stream().forEach(examCenterCO -> {
List<ClassCurriculumChapterDO> classCurriculumChapterDOList = classCurriculumChapterRepository.listByClassCurriculumId(examCenterCO.getClassCurriculumId());
long videoCount = classCurriculumChapterDOList.stream().filter(bean -> !ObjectUtils.isEmpty(bean.getVideoCoursewareId())).count();
examCenterCO.setVideoCount(videoCount);
});
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}
/**
*
*
* @param id
* @return
*/
@ -74,7 +82,7 @@ public class ClassCurriculumQueryExe {
public MultiResponse<ClassCurriculumCO> executeListAll(ClassCurriculumQry qry) {
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<ClassCurriculumDO> curList = classCurriculumRepository.listAll(params);
if (curList != null && curList.size() > 0){
if (curList != null && curList.size() > 0) {
List<String> classCurriculumIds = curList.stream().map(ClassCurriculumDO::getClassCurriculumId).collect(Collectors.toList());
List<ClassCurriculumChapterDO> chapterList = classCurriculumChapterRepository.listByClassCurriculumIds(classCurriculumIds);
List<ClassCurriculumChapterCO> chapterCoList = classCurriculumChapterCoConvertor.converDOsToCOs(chapterList);

View File

@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.utils.AuthContext;
import com.zcloud.edu.command.convertor.study.StudentCoConvertor;
import com.zcloud.edu.domain.model.archives.ClassArchivesE;
import com.zcloud.edu.domain.model.archives.PersonArchivesE;
@ -11,13 +12,22 @@ import com.zcloud.edu.domain.model.study.*;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentCountByCorpCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountByCorpCO;
import com.zcloud.edu.dto.clientobject.study.StudentSignCO;
import com.zcloud.edu.dto.data.archives.ClassArchivesDTO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.EducationUserQry;
import com.zcloud.edu.dto.study.StudentCountByCorpQry;
import com.zcloud.edu.dto.study.StudentCountQry;
import com.zcloud.edu.dto.study.StudentExamCountQry;
import com.zcloud.edu.dto.study.StudentExamCountByCorpQry;
import com.zcloud.edu.dto.study.StudentPageQry;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountByCorpPO;
import com.zcloud.edu.persistence.dataobject.study.*;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountByCorpPO;
import com.zcloud.edu.persistence.repository.study.*;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Tools;
@ -242,6 +252,34 @@ public class StudentQueryExe {
return MultiResponse.of(studentCOList);
}
public MultiResponse<StudentExamCountCO> executeListExamCount(StudentExamCountQry qry){
if(qry.getClassCorpinfoId()==null){
qry.setClassCorpinfoId(AuthContext.getTenantId());
}
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<StudentExamCountPO> countList = studentRepository.listExamCount(params);
List<StudentExamCountCO> countCOList = BeanUtil.copyToList(countList, StudentExamCountCO.class);
return MultiResponse.of(countCOList);
}
public MultiResponse<StudentExamCountByCorpCO> executeListExamCountByCorp(StudentExamCountByCorpQry qry){
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<StudentExamCountByCorpPO> countList = studentRepository.listExamCountByCorp(params);
List<StudentExamCountByCorpCO> countCOList = BeanUtil.copyToList(countList, StudentExamCountByCorpCO.class);
return MultiResponse.of(countCOList);
}
public MultiResponse<StudentCountByCorpCO> executeListStudentCountByCorp(StudentCountByCorpQry qry){
if(qry.getInterestedId()==null){
qry.setInterestedId(AuthContext.getTenantId().toString());
}
Map<String, Object> params = PageQueryHelper.toHashMap(qry);
List<StudentCountByCorpPO> countList = studentRepository.listStudentCountByCorp(params);
List<StudentCountByCorpCO> countCOList = BeanUtil.copyToList(countList, StudentCountByCorpCO.class);
return MultiResponse.of(countCOList);
}
public SingleResponse<StudentCO> executeGetInfoByStudentId(String studentId){
StudentDO studentDO = studentRepository.findInfoByStudentId(studentId);
StudentCO studentCO = BeanUtil.copyProperties(studentDO, StudentCO.class);

View File

@ -11,12 +11,14 @@ import com.zcloud.edu.command.study.StudentUpdateExe;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentCountByCorpCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountByCorpCO;
import com.zcloud.edu.dto.data.archives.ClassArchivesDTO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.*;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@ -112,6 +114,21 @@ public class StudentServiceImpl implements StudentServiceI {
return studentQueryExe.executeListStudentCount(qry);
}
@Override
public MultiResponse<StudentExamCountCO> listExamCount(StudentExamCountQry qry) {
return studentQueryExe.executeListExamCount(qry);
}
@Override
public MultiResponse<StudentExamCountByCorpCO> listExamCountByCorp(StudentExamCountByCorpQry qry) {
return studentQueryExe.executeListExamCountByCorp(qry);
}
@Override
public MultiResponse<StudentCountByCorpCO> listStudentCountByCorp(StudentCountByCorpQry qry) {
return studentQueryExe.executeListStudentCountByCorp(qry);
}
@Override
public SingleResponse<StudentCO> getInfoByStudentId(String studentId) {
return studentQueryExe.executeGetInfoByStudentId(studentId);

View File

@ -6,6 +6,9 @@ import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
import com.zcloud.edu.dto.clientobject.study.StudentCountByCorpCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountCO;
import com.zcloud.edu.dto.clientobject.study.StudentExamCountByCorpCO;
import com.zcloud.edu.dto.data.archives.ClassArchivesDTO;
import com.zcloud.edu.dto.data.archives.PersonArchivesDTO;
import com.zcloud.edu.dto.study.*;
@ -49,6 +52,12 @@ public interface StudentServiceI {
MultiResponse<StudentCO> listStudentCount(StudentCountQry qry);
MultiResponse<StudentExamCountCO> listExamCount(StudentExamCountQry qry);
MultiResponse<StudentExamCountByCorpCO> listExamCountByCorp(StudentExamCountByCorpQry qry);
MultiResponse<StudentCountByCorpCO> listStudentCountByCorp(StudentCountByCorpQry qry);
SingleResponse<StudentCO> getInfoByStudentId(String studentId);
PageResponse<EducationUserCO> educationUserList(EducationUserQry qry);

View File

@ -199,6 +199,10 @@ public class StudentCO extends ClientObject {
@TableField(exist = false)
private Integer studentCount;
@ApiModelProperty(value = "培训合格数量")
@TableField(exist = false)
private Integer qualifiedStudentCount;

View File

@ -0,0 +1,44 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 15:05:00
*/
@Data
public class StudentCountByCorpCO extends ClientObject {
@ApiModelProperty(value = "部门名称")
private String departmentName;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "身份证号")
private String userIdCard;
@ApiModelProperty(value = "已通过培训数")
private Integer completeClassCount;
@ApiModelProperty(value = "培训总数")
private Integer classCount;
@ApiModelProperty(value = "培训有效期开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime startTime;
@ApiModelProperty(value = "培训有效期结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,27 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 14:32:00
*/
@Data
public class StudentExamCountByCorpCO extends ClientObject {
@ApiModelProperty(value = "企业id")
private Long corpinfoId;
@ApiModelProperty(value = "企业名称")
private String corpName;
@ApiModelProperty(value = "涉及相关方单位数")
private Long relatedCorpCount;
@ApiModelProperty(value = "涉及人数")
private Long studentCount;
}

View File

@ -0,0 +1,30 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 15:45:00
*/
@Data
public class StudentExamCountCO extends ClientObject {
@ApiModelProperty(value = "企业id")
private Long classCorpinfoId;
@ApiModelProperty(value = "所属相关方id")
private String interestedId;
@ApiModelProperty(value = "所属相关方名称")
private String interestedName;
@ApiModelProperty(value = "涉及人数")
private Integer studentCount;
@ApiModelProperty(value = "培训有效人数")
private Integer qualifiedStudentCount;
}

View File

@ -0,0 +1,28 @@
package com.zcloud.edu.dto.study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 15:05:00
*/
@Data
public class StudentCountByCorpQry {
@ApiModelProperty(value = "企业id")
private Long classCorpinfoId;
@ApiModelProperty(value = "相关方id")
private String interestedId;
@ApiModelProperty(value = "姓名模糊查询")
private String likeName;
@ApiModelProperty(value = "培训有效期筛选1-正常 -1-过期 -2-横杠 -3-待定")
private Integer isValid;
private String menuPath;
}

View File

@ -1,6 +1,7 @@
package com.zcloud.edu.dto.study;
import com.alibaba.cola.dto.PageQuery;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@ -27,13 +28,18 @@ public class StudentCountQry {
*/
private String eqStudentId;
private String eqClassId;
private String likeProjectNames;
private String likeName;
private String likeInterestedIds;
private List<Long> corpinfoIds;
private List<String> phones;
private String year;
@ApiModelProperty(value = "相关方id", name = "eqInterestedIds")
private String eqInterestedIds;
@ApiModelProperty(value = "企业id", name = "classCorpinfoId")
private Long classCorpinfoId;
}

View File

@ -0,0 +1,18 @@
package com.zcloud.edu.dto.study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 14:32:00
*/
@Data
public class StudentExamCountByCorpQry {
@ApiModelProperty(value = "企业名称模糊查询")
private String likeCorpName;
private Long corpinfoId;
}

View File

@ -0,0 +1,23 @@
package com.zcloud.edu.dto.study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-client
*
* @Author zhangyue
* @Date 2026-06-13 15:45:00
*/
@Data
public class StudentExamCountQry {
@ApiModelProperty(value = "所属相关方id")
private String interestedId;
@ApiModelProperty(value = "企业id")
private Long classCorpinfoId;
@ApiModelProperty(value = "年份")
private String year;
}

View File

@ -119,6 +119,10 @@ public class StudentDO extends BaseDO {
@TableField(exist = false)
private Integer studentCount;
@ApiModelProperty(value = "鍚堟牸浜烘暟")
@TableField(exist = false)
private Integer qualifiedStudentCount;
@ApiModelProperty(value = "完成班级数")
@TableField(exist = false)

View File

@ -0,0 +1,43 @@
package com.zcloud.edu.persistence.mapper.po.study;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-06-13 15:05:00
*/
@Data
public class StudentCountByCorpPO {
@ApiModelProperty(value = "部门名称")
private String departmentName;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "身份证号")
private String userIdCard;
@ApiModelProperty(value = "已通过培训数")
private Integer completeClassCount;
@ApiModelProperty(value = "培训总数")
private Integer classCount;
@ApiModelProperty(value = "培训有效期开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime startTime;
@ApiModelProperty(value = "培训有效期结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,26 @@
package com.zcloud.edu.persistence.mapper.po.study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-06-13 14:32:00
*/
@Data
public class StudentExamCountByCorpPO {
@ApiModelProperty(value = "企业id")
private Long corpinfoId;
@ApiModelProperty(value = "企业名称")
private String corpName;
@ApiModelProperty(value = "涉及相关方单位数")
private Long relatedCorpCount;
@ApiModelProperty(value = "涉及人数")
private Long studentCount;
}

View File

@ -0,0 +1,29 @@
package com.zcloud.edu.persistence.mapper.po.study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* web-infrastructure
*
* @Author zhangyue
* @Date 2026-06-13 15:45:00
*/
@Data
public class StudentExamCountPO {
@ApiModelProperty(value = "企业id")
private Long classCorpinfoId;
@ApiModelProperty(value = "所属相关方id")
private String interestedId;
@ApiModelProperty(value = "所属相关方名称")
private String interestedName;
@ApiModelProperty(value = "涉及人数")
private Integer studentCount;
@ApiModelProperty(value = "培训有效人数")
private Integer qualifiedStudentCount;
}

View File

@ -1,6 +1,5 @@
package com.zcloud.edu.persistence.mapper.study;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -9,7 +8,9 @@ import com.jjb.saas.framework.datascope.annotation.DataScopes;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.persistence.dataobject.study.ClassDO;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountByCorpPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountByCorpPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -24,7 +25,8 @@ import java.util.Map;
*/
@Mapper
@DataScopes({
@DataScope(method = "personnelFileListPage", menuPerms = "")
@DataScope(method = "personnelFileListPage", menuPerms = ""),
@DataScope(method = "listStudentCountByCorp", menuPerms = "")
})
public interface StudentMapper extends BaseMapper<StudentDO> {
@ -49,6 +51,12 @@ public interface StudentMapper extends BaseMapper<StudentDO> {
List<StudentDO> listStudentCount(@Param("params") Map<String, Object> params);
List<StudentCountByCorpPO> listStudentCountByCorp(@Param("params") Map<String, Object> params, String menuPerms);
List<StudentExamCountPO> listExamCount(@Param("params") Map<String, Object> params);
List<StudentExamCountByCorpPO> listExamCountByCorp(@Param("params") Map<String, Object> params);
StudentDO findInfoByStudentId(@Param("studentId") String studentId);

View File

@ -11,13 +11,16 @@ import com.zcloud.edu.domain.enums.MenuEnum;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.persistence.dataobject.study.ClassDO;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountByCorpPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountByCorpPO;
import com.zcloud.edu.persistence.mapper.study.StudentMapper;
import com.zcloud.edu.persistence.repository.study.StudentRepository;
import com.zcloud.gbscommon.utils.PageQueryHelper;
import com.zcloud.gbscommon.utils.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.Map;
@ -138,6 +141,25 @@ public class StudentRepositoryImpl extends BaseRepositoryImpl<StudentMapper, Stu
return studentMapper.listStudentCount(params);
}
@Override
public List<StudentCountByCorpPO> listStudentCountByCorp(Map<String, Object> params) {
String menuPerms = "";
if (!ObjectUtils.isEmpty(params.get("menuPath"))) {
menuPerms = MenuEnum.getMenuKeyByPath(params.get("menuPath").toString());
}
return studentMapper.listStudentCountByCorp(params,menuPerms);
}
@Override
public List<StudentExamCountPO> listExamCount(Map<String, Object> params) {
return studentMapper.listExamCount(params);
}
@Override
public List<StudentExamCountByCorpPO> listExamCountByCorp(Map<String, Object> params) {
return studentMapper.listExamCountByCorp(params);
}
@Override
public PageResponse<EducationUserCO> educationUserList(Map<String, Object> params) {
Page<Map<String, Object>> page = new Page<>(Integer.parseInt(params.get("pageIndex").toString()), Integer.parseInt(params.get("pageSize").toString()));

View File

@ -5,7 +5,9 @@ import com.jjb.saas.framework.repository.repo.BaseRepository;
import com.zcloud.edu.dto.clientobject.study.EducationUserCO;
import com.zcloud.edu.persistence.dataobject.study.ClassDO;
import com.zcloud.edu.persistence.dataobject.study.StudentDO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentCountByCorpPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountPO;
import com.zcloud.edu.persistence.mapper.po.study.StudentExamCountByCorpPO;
import java.util.List;
import java.util.Map;
@ -48,6 +50,12 @@ public interface StudentRepository extends BaseRepository<StudentDO> {
List<StudentDO> listStudentCount(Map<String, Object> params);
List<StudentCountByCorpPO> listStudentCountByCorp(Map<String, Object> params);
List<StudentExamCountPO> listExamCount(Map<String, Object> params);
List<StudentExamCountByCorpPO> listExamCountByCorp(Map<String, Object> params);
PageResponse<EducationUserCO> educationUserList(Map<String, Object> params);
PageResponse<EducationUserCO> pushCandidateUserList(Map<String, Object> params);

View File

@ -36,7 +36,7 @@
and DATE(ep.create_time) <![CDATA[>=]]> #{params.uploadStartTime}
</if>
<if test="params.uploadEndTime != null and params.uploadEndTime!=''">
and DATE(ep.create_time) <![CDATA[<=]]> #{params.uploadStartTime}
and DATE(ep.create_time) <![CDATA[<=]]> #{params.uploadEndTime}
</if>
order by ep.create_time desc

View File

@ -12,6 +12,7 @@
cc.curriculum_name,
cc.video_total_time,
c.training_type_id,
tt.name as trainingTypeName,
c.corpinfo_id,
co.corp_name,
c.video_total_time curriculumVideoTotalTime,
@ -23,6 +24,7 @@
class_curriculum cc
left join curriculum c on c.curriculum_id = cc.curriculum_id
left join corp_info co on co.id = c.corpinfo_id
left join training_type tt on tt.training_type_id = c.training_type_id
<where>
cc.id = #{id}
</where>

View File

@ -182,6 +182,145 @@
group by s.phone
</select>
<select id="listStudentCountByCorp" resultType="com.zcloud.edu.persistence.mapper.po.study.StudentCountByCorpPO">
SELECT
max(coalesce(u.name, s.name)) AS name,
s.phone,
count(DISTINCT s.student_id) AS classCount,
count(DISTINCT CASE WHEN s.state = 1 THEN s.student_id END) AS completeClassCount,
max(d.name) AS departmentName,
max(coalesce(u.user_id_card, s.user_id_card)) AS userIdCard,
max(tu.start_time) AS startTime,
max(tu.end_time) AS endTime
FROM
student s
inner join class c on c.class_id = s.class_id
and c.delete_enum = 'FALSE'
left join user u on u.phone = s.phone
and u.delete_enum = 'FALSE'
left join department d on d.id = u.department_id
and d.delete_enum = 'FALSE'
left join (
SELECT
phone,
start_time,
end_time
FROM
(
SELECT
phone,
start_time,
end_time,
ROW_NUMBER() OVER (
PARTITION BY phone
ORDER BY
CASE WHEN end_time IS NULL THEN 1 ELSE 0 END ASC,
end_time DESC,
CASE WHEN start_time IS NULL THEN 1 ELSE 0 END ASC,
start_time DESC,
update_time DESC,
create_time DESC
) rn
FROM
training_user
WHERE
delete_enum = 'FALSE'
) t
WHERE
t.rn = 1
) tu on tu.phone = s.phone
<where>
s.interested_ids = #{params.interestedId}
and s.delete_enum = 'FALSE'
<if test="params.classCorpinfoId != null ">
and s.class_corpinfo_id = #{params.classCorpinfoId}
</if>
<if test="params.likeName != null and params.likeName != ''">
and coalesce(u.name, s.name) like concat('%',#{params.likeName},'%')
</if>
<if test="params.isValid != null and params.isValid == 1">
and (tu.start_time &lt;= now() and tu.end_time &gt;= now())
</if>
<if test="params.isValid != null and params.isValid == -1">
and now() not between tu.start_time and tu.end_time
</if>
<if test="params.isValid != null and params.isValid == -2">
and tu.end_time is null
</if>
<if test="params.isValid != null and params.isValid == -3">
and (tu.end_time is null or now() not between tu.start_time and tu.end_time)
</if>
</where>
GROUP BY
s.phone
ORDER BY
max(d.name) asc,
max(coalesce(u.name, s.name)) asc
</select>
<select id="listExamCount" resultType="com.zcloud.edu.persistence.mapper.po.study.StudentExamCountPO">
SELECT
s.interested_ids AS interestedId,
s.class_corpinfo_id as classCorpinfoId,
max(s.interested_names) AS interestedName,
count(DISTINCT s.phone) AS studentCount,
count(DISTINCT CASE WHEN s.state = 1 THEN s.phone END) AS qualifiedStudentCount
FROM
student s
left join class c on c.class_id = s.class_id
and c.delete_enum = 'FALSE'
left join corp_info ci on ci.id = s.interested_ids
and ci.delete_enum = 'FALSE'
<where>
s.delete_enum = 'FALSE'
and s.interested_ids is not null
and s.interested_ids != ''
<if test="params.interestedId != null and params.interestedId != ''">
and s.interested_ids = #{params.interestedId}
</if>
<if test="params.classCorpinfoId != null">
and s.class_corpinfo_id = #{params.classCorpinfoId}
</if>
<if test="params.year != null and params.year != ''">
and DATE_FORMAT(c.start_time, '%Y') = #{params.year}
</if>
</where>
group by
s.interested_ids
order by
ci.corp_order asc,
ci.create_time asc
</select>
<select id="listExamCountByCorp" resultType="com.zcloud.edu.persistence.mapper.po.study.StudentExamCountByCorpPO">
SELECT
ci.id AS corpinfoId,
ci.corp_name AS corpName,
count(DISTINCT CASE
WHEN s.interested_ids is not null and s.interested_ids != '' THEN s.interested_ids
END) AS relatedCorpCount,
count(DISTINCT s.phone) AS studentCount
FROM
corp_info ci
left join student s on ci.id = s.class_corpinfo_id
and s.delete_enum = 'FALSE'
<where>
ci.delete_enum = 'FALSE'
and ci.type in (0, 1, 6)
<if test="params.likeCorpName != null and params.likeCorpName != ''">
and ci.corp_name like concat('%',#{params.likeCorpName},'%')
</if>
<if test="params.corpinfoId != null">
and ci.id =#{params.corpinfoId}
</if>
</where>
group by
ci.id
order by
ci.corp_order asc,
ci.create_time asc
</select>
<select id="listPageClassByStudent" resultType="com.zcloud.edu.persistence.dataobject.study.StudentDO">
select
s.id,