index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. <!-- @desc:系统参数一览 @auth:沈博 @time:2022年12月14日11:01:32 -->
  2. <template>
  3. <div class="main-div" ref="mainDiv">
  4. <!--加载中-->
  5. <loading :loading="loading" v-if="!modalVisible"></loading>
  6. <!--按钮区-->
  7. <BaseIndexButtonGroup id="BaseIndexButtonGroup">
  8. <template #left>
  9. <!-- 刷新 -->
  10. <BaseIndexButton right-button="post-refresh" ref="refresh" name="refresh"
  11. @click="open($config.routeUrl.search,'leftTable')"></BaseIndexButton>
  12. <!-- 保存 -->
  13. <BaseIndexButton right-button="post-save" ref="save" name="save"
  14. @click="open($config.routeUrl.systemSetting.save,'leftTable',false)"></BaseIndexButton>
  15. </template>
  16. </BaseIndexButtonGroup>
  17. <!-- 列表部分 -->
  18. <card ref="tableCard">
  19. <div style="display: flex;width: 100%;height: 100%">
  20. <!-- 列表部分左侧 -->
  21. <div style="width: 200px;">
  22. <DkTable
  23. ref="leftTable"
  24. :data="searchInfo"
  25. :height="tableHeight-30"
  26. :page-flag="false"
  27. :page-total-flag="false"
  28. :show-setting-flag="false"
  29. :freeze="false"
  30. :choose-flag="false"
  31. @current-change="currentChangeEvent($event)">
  32. <DkTableColumn :title="$t('className')" field="className"
  33. width="auto" :filter=false :center-flag="true"></DkTableColumn>
  34. </DkTable>
  35. </div>
  36. <!-- 列表部分右侧 -->
  37. <div style="margin-left: 5px;width:calc( 100% - 200px )">
  38. <DkTable
  39. ref="rightTable"
  40. :data="tableRightData"
  41. :height="tableHeight-30"
  42. :page-flag="false"
  43. :page-total-flag="false"
  44. :show-setting-flag="false"
  45. :freeze="false"
  46. :choose-flag="false">
  47. <DkTableColumn field="classCode" :title="$t('settingStyle')" width="100"></DkTableColumn>
  48. <DkTableColumn field="settingName" width="220"></DkTableColumn>
  49. <vxe-column show-overflow="ellipsis" field="settingValue" width="100" height="100" min-width="80" class-name="setting-value-class"
  50. :title="$t('settingValue')"
  51. >
  52. <template #default="{ row }">
  53. <!--数字类型-->
  54. <vxe-input v-if="row.valueKind == 'INT'" size="mini"
  55. @blur="blursSettingValue(row)"
  56. type="integer"
  57. :min="row.settingCode == $config.sysCode.SYS_CODE_016 ? -1 : row.valueFormat.min"
  58. :max="row.valueFormat.max" v-model="row.settingValue"></vxe-input>
  59. <!--文本类型-->
  60. <vxe-input v-if="row.valueKind == 'STR'" :maxlength="row.valueFormat.length"
  61. @blur="blursSettingValue(row)"
  62. size="mini" v-model="row.settingValue"></vxe-input>
  63. <!--布尔类型-->
  64. <i-switch size="small" v-if="row.valueKind == 'BOOL'" v-model="row.settingValue"
  65. @on-change="changeSwitch($event,row)"></i-switch>
  66. <!--下拉框类型-->
  67. <vxe-select transfer v-if="row.valueKind == 'S-CHOICE'" v-model="row.settingValue"
  68. size="mini" @change="changeOption($event,row)">
  69. <vxe-option v-for="item in row.valueFormat.items" :key="item.key"
  70. :value="item.key" :label="item.value"></vxe-option>
  71. </vxe-select>
  72. <!-- 小数-->
  73. <vxe-input v-if="row.valueKind == 'NUM'" size="mini"
  74. @blur="blursSettingValue(row)"
  75. type="number"
  76. :min="row.settingCode == $config.sysCode.SYS_CODE_016 ? -1 : row.valueFormat.min"
  77. :max="row.valueFormat.max" v-model="row.settingValue"></vxe-input>
  78. </template>
  79. </vxe-column>
  80. <!-- <vxe-column show-overflow="ellipsis" field="settingDefault" width="100" height="100" min-width="80"-->
  81. <!-- :title="$t('settingDefault')"-->
  82. <!-- >-->
  83. <!-- <template #default="{ row }">-->
  84. <!-- &lt;!&ndash;数字类型&ndash;&gt;-->
  85. <!-- <vxe-input v-if="row.valueKind == 'INT' || row.valueKind == 'NUM'" size="mini" :disabled=true-->
  86. <!-- v-model="row.settingDefault"></vxe-input>-->
  87. <!-- &lt;!&ndash;文本类型&ndash;&gt;-->
  88. <!-- <vxe-input v-if="row.valueKind == 'STR'" :disabled=true-->
  89. <!-- size="mini" v-model="row.settingDefault"></vxe-input>-->
  90. <!-- &lt;!&ndash;下拉框类型&ndash;&gt;-->
  91. <!-- <vxe-input v-if="row.valueKind == 'S-CHOICE'" :disabled=true-->
  92. <!-- size="mini" v-model="row.settingDefault"></vxe-input>-->
  93. <!-- &lt;!&ndash;布尔类型&ndash;&gt;-->
  94. <!-- <i-switch size="small" :disabled=true v-if="row.valueKind == 'BOOL'"-->
  95. <!-- v-model="row.settingDefault"></i-switch>-->
  96. <!-- </template>-->
  97. <!-- </vxe-column>-->
  98. <DkTableColumn field="settingDescription" width="auto"></DkTableColumn>
  99. </DkTable>
  100. </div>
  101. </div>
  102. </card>
  103. </div>
  104. </template>
  105. <script>
  106. //导入包
  107. import {indexMixin} from '@/mixins'
  108. export default {
  109. name: 'system-setting',
  110. mixins: [indexMixin],
  111. data() {
  112. return {
  113. // 右侧侧列表
  114. tableRightData: [],
  115. }
  116. },
  117. watch: {
  118. searchInfo(n, o) {
  119. let filters = n?.filter(it => it.classType == this.$config.sysType.password_security_policy)
  120. if (!filters || filters.length === 0) {
  121. if (n) {
  122. n.splice(0, 0, {
  123. displayNo: 0,
  124. classType: this.$config.sysType.password_security_policy,
  125. className: this.$t('all')
  126. })
  127. }
  128. }
  129. }
  130. },
  131. methods: {
  132. // region 一览界面操作start
  133. /**
  134. * @desc : 下拉框值变化事件
  135. * @author : 寇珊珊
  136. * @date : 2022/3/7 17:32
  137. */
  138. changeOption(e, row) {
  139. // 值是否发生变化
  140. if (row.settingValueBack != row.settingValue) {
  141. this.tableRightData.forEach(it => {
  142. if (it.settingCode == row.settingCode) {
  143. // valueChangeFlg为true值发生变化
  144. let arraySettingValue = it.valueFormat.items.filter(iv => iv.key == e.value)
  145. if (arraySettingValue && arraySettingValue.length > 0) {
  146. it.settingValue = arraySettingValue[0].value
  147. }
  148. // 新增加的
  149. it.settingValueKey = e.value
  150. it['valueChangeFlg'] = true
  151. }
  152. })
  153. }
  154. },
  155. /**
  156. * @desc : 开关值变化事件
  157. * @author : 寇珊珊
  158. * @date : 2022/3/7 20:00
  159. */
  160. changeSwitch(e, row) {
  161. // 值是否发生变化
  162. if (row.settingValueBack != row.settingValue) {
  163. this.tableRightData.forEach(it => {
  164. if (it.settingCode == row.settingCode) {
  165. // valueChangeFlg为true值发生变化
  166. it.settingValue = e
  167. it['valueChangeFlg'] = true
  168. }
  169. })
  170. }
  171. },
  172. /**
  173. * @desc : 文本和数字的值焦点离开事件
  174. * @author : 寇珊珊
  175. * @date : 2022/3/6 9:46
  176. */
  177. blursSettingValue(row) {
  178. // 修改了原来的值
  179. if (row.settingValueBack != row.settingValue) {
  180. this.tableRightData.forEach(it => {
  181. if (it.settingCode == row.settingCode) {
  182. // valueChangeFlg为true值发生变化
  183. it['valueChangeFlg'] = true
  184. }
  185. })
  186. }
  187. },
  188. /**
  189. * @desc : 左侧列表行变化事件
  190. * @author : 寇珊珊
  191. * @date : 2022/3/5 8:51
  192. */
  193. currentChangeEvent({row}) {
  194. // 获取当前行数据
  195. // 值发生变化的保存 valueChangeFlg为true值发生变化
  196. let list = this.tableRightData.filter(it => it.valueChangeFlg == true)
  197. if (list && list.length > 0) {
  198. this.$IBMessage({content: this.$t('Q_001'), title: this.$t('systemQuestion')},
  199. {
  200. ok: () => {
  201. //参数校验
  202. this.validData().then(res => {
  203. if (res) {
  204. // 保存-如果表里有该数据则update
  205. this.saveData()
  206. }
  207. })
  208. if (row != null) {
  209. //查询租户系统参数列表的数据-右侧列表
  210. this.getSettingData(row.classCode)
  211. }
  212. },
  213. cancel: () => {
  214. if (row != null) {
  215. //查询租户系统参数列表的数据-右侧列表
  216. this.getSettingData(row.classCode)
  217. }
  218. }
  219. })
  220. } else {
  221. if (row != null) {
  222. //查询租户系统参数列表的数据-右侧列表
  223. this.getSettingData(row.classCode)
  224. }
  225. }
  226. },
  227. // endregion
  228. // region 新建/编辑start
  229. /**
  230. * @desc : 保存参数校验
  231. * @author : 夏常明
  232. * @date : 2023/1/31 9:56
  233. */
  234. async validData() {
  235. let list = this.tableRightData?.copy();
  236. if (list && list.length > 0) {
  237. for (let i = 0; i < list.length; i++) {
  238. if (list[i].valueChangeFlg && !(list[i].valueKind == 'BOOL' || list[i].valueKind == 'S-CHOICE') && !list[i].settingValue) {
  239. this.$Message.error(this.$t('W_089', {'param1': (i + 1), 'param2': "参数值"}) + ';')
  240. return false;
  241. }
  242. }
  243. } else {
  244. return false;
  245. }
  246. return true;
  247. },
  248. /**
  249. * @desc : 系统参数发生变化时给参数赋值
  250. * @author : 夏常明
  251. * @date : 2023/1/30 11:47
  252. */
  253. setParams() {
  254. let params = []
  255. // 值发生变化的保存 valueChangeFlg为true值发生变化
  256. let list = this.tableRightData.filter(it => it.valueChangeFlg == true)
  257. if (list && list.length > 0) {
  258. let message = ''
  259. list.forEach(it => {
  260. if (!(it.valueKind == 'BOOL' || it.valueKind == 'S-CHOICE') && (it.settingValue == '' || it.settingValue === undefined)) {
  261. message += this.$t('W_001', {'param': this.$t('settingValue')})
  262. return
  263. }
  264. // 输入类型 布尔类型 下拉类型的赋值
  265. if (it.valueKind == 'BOOL') {
  266. params.push({
  267. settingCode: it.settingCode, //参数代码
  268. settingValue: it.settingValue ? 1 : 0, //参数值
  269. ftyId: this.$store.state.user.ftyId,
  270. })
  271. } else if (it.valueKind == 'S-CHOICE') {
  272. params.push({
  273. settingCode: it.settingCode, //参数代码
  274. settingValue: it.settingValueKey,//参数值
  275. ftyId: this.$store.state.user.ftyId,
  276. })
  277. } else {
  278. params.push({
  279. settingCode: it.settingCode, //参数代码
  280. settingValue: it.settingValue, //参数值
  281. ftyId: this.$store.state.user.ftyId,
  282. })
  283. }
  284. })
  285. }
  286. this.params = params;
  287. },
  288. /**
  289. * @desc : 保存系统参数值
  290. * @author : 夏常明
  291. * @date : 2023/1/30 17:21
  292. */
  293. saveData() {
  294. this.loading = true;
  295. let params = []
  296. // 值发生变化的保存 valueChangeFlg为true值发生变化
  297. let list = this.tableRightData.filter(it => it.valueChangeFlg == true)
  298. if (list && list.length > 0) {
  299. let message = ''
  300. list.forEach(it => {
  301. // 输入类型 布尔类型 下拉类型的赋值
  302. if (it.valueKind == 'BOOL') {
  303. params.push({
  304. settingCode: it.settingCode, //参数代码
  305. settingValue: it.settingValue ? 1 : 0, //参数值
  306. ftyId: this.$store.state.user.ftyId,
  307. })
  308. } else if (it.valueKind == 'S-CHOICE') {
  309. params.push({
  310. settingCode: it.settingCode, //参数代码
  311. settingValue: it.settingValueKey,//参数值
  312. ftyId: this.$store.state.user.ftyId,
  313. })
  314. } else {
  315. params.push({
  316. settingCode: it.settingCode, //参数代码
  317. settingValue: it.settingValue, //参数值
  318. ftyId: this.$store.state.user.ftyId,
  319. })
  320. }
  321. })
  322. }
  323. if (params && params.length > 0) {
  324. this.$refs.save.$el.focus()
  325. this.excute(this.$service.systemService, this.$service.systemService.updateSettingValues, params).then(res => {
  326. if (res.code === this.$config.SUCCESS_CODE) {
  327. this.$Message.success(this.$t('I_001', {'param': this.$v('save')}))
  328. let nowRow = this.$refs['leftTable'].getCurrentRow()
  329. if (nowRow != null) {
  330. // 查询参数列表的数据-右侧列表
  331. this.getSettingData(nowRow.classCode)
  332. }
  333. }
  334. this.loading = false;
  335. })
  336. }else{
  337. this.loading = false;
  338. }
  339. },
  340. /**
  341. * @desc : 获取数据
  342. * @author : 沈博
  343. * @date : 2022年12月13日15:04:17
  344. */
  345. getData() {
  346. return this.excute(this.$service.commonService, this.$service.commonService.getSettingKind, {}); // 参数分类列表
  347. },
  348. /**
  349. * @desc : 查询系统参数-右侧列表
  350. * @author : 夏常明
  351. * @date : 2023/1/30 11:45
  352. */
  353. getSettingData(classCode = '') {
  354. // 置查询条件
  355. this.tableRightList = []
  356. // 租户系统参数列表的参数设定
  357. // let params = this.setSettingDataParams(classCode)
  358. let params = {
  359. settingKind: classCode,
  360. ftyId: this.$store.state.user.ftyId,
  361. }
  362. // 调用查询系统参数项目列表数据接口,查询右侧列表数据
  363. this.excute(this.$service.systemService, this.$service.systemService.getSettingValue, params).then(res => {
  364. if (res.code === this.$config.SUCCESS_CODE) {
  365. res.data.forEach(it => {
  366. if (it.valueFormat != undefined) {
  367. it.valueFormat = JSON.parse(it.valueFormat.value)
  368. }
  369. // 布尔类型
  370. if (it.valueKind == 'BOOL') {
  371. it.settingValue = it.settingValue == 1
  372. it.settingDefault = it.settingDefault == 1 ? this.$t('yes') : this.$t('no')
  373. }
  374. // 下拉类型
  375. if (it.valueKind == 'S-CHOICE') {
  376. //循环同步数据源key值类型 和系统参数、默认值 值类型
  377. it.valueFormat.items.forEach(str =>{
  378. str.key=String(str.key);
  379. })
  380. // 当前值
  381. let arraySettingValue = it.valueFormat.items.filter(iv => iv.key == it.settingValue)
  382. // 默认值
  383. let arraySettingDefault = it.valueFormat.items.filter(iv => iv.key == it.settingDefault)
  384. if(arraySettingValue.length>0)
  385. {
  386. it.settingValue = arraySettingValue[0].value
  387. }
  388. if(arraySettingDefault.length>0)
  389. {
  390. it.settingDefault = arraySettingDefault[0].value
  391. }
  392. }
  393. // 判断是否值和原来的值发生变化
  394. it.settingValueBack = it.settingValue
  395. this.tableRightList.push(it)
  396. })
  397. this.tableRightData=this.tableRightList;
  398. // 参数列表的数据-右侧列表-选中第一行
  399. if (this.tableRightData && this.tableRightData.length > 0) {
  400. this.$refs.rightTable.setCurrentRow(this.tableRightData[0])
  401. }
  402. }
  403. })
  404. },
  405. // endregion
  406. },
  407. /**
  408. * @desc : 在实例创建完成后被立即同步调用
  409. * @author : 寇珊珊
  410. * @date : 2022/3/3 10:32
  411. */
  412. created() {
  413. this.pageFlag=false;
  414. },
  415. }
  416. </script>
  417. <style scoped>
  418. /deep/.setting-value-class .vxe-cell{
  419. padding-left: 0 !important;
  420. padding-right: 0 !important;
  421. display: flex !important;
  422. align-items: center !important;
  423. justify-content: center;
  424. }
  425. /deep/.vxe-input--inner{
  426. text-align: center !important;
  427. padding: 0 !important;
  428. }
  429. /deep/ .vxe-cell {
  430. display: flex;
  431. align-items: center;
  432. /*padding-left: 0 !important;*/
  433. /*padding-right: 0 !important;*/
  434. }
  435. /deep/ .vxe-input--number-prev-icon {
  436. display: none;
  437. }
  438. /deep/ .vxe-input--number-next-icon {
  439. display: none;
  440. }
  441. /deep/ .vxe-input .vxe-input--extra-suffix {
  442. display: none;
  443. }
  444. /deep/ .vxe-input :hover {
  445. border: 1px solid #57a3f3 !important;
  446. border-radius: 2px;
  447. }
  448. /deep/ .vxe-input > input:focus {
  449. border-color: #57a3f3 !important;
  450. border-radius: 2px;
  451. -webkit-box-shadow: 0 0 0 1px rgba(45, 140, 240, .2) !important;
  452. box-shadow: 0 0 0 1px rgba(45, 140, 240, .2) !important;
  453. }
  454. </style>