Packagingoutput.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515
  1. <template>
  2. <div>
  3. <el-container>
  4. <el-aside width="200px">
  5. <div class="JKWTree-tree">
  6. <h3 > 组织列表</h3>
  7. <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
  8. </div>
  9. </el-aside>
  10. <el-container>
  11. <!-- <el-header>dd</el-header>-->
  12. <el-main>
  13. <div class="gva-search-box">
  14. <el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
  15. <el-form-item label="创建日期" prop="createdAt">
  16. <template #label>
  17. <span>
  18. 创建日期
  19. <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
  20. <el-icon><QuestionFilled /></el-icon>
  21. </el-tooltip>
  22. </span>
  23. </template>
  24. <el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
  25. <el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
  26. </el-form-item>
  27. <el-form-item>
  28. <el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
  29. <el-button icon="refresh" @click="onReset">重置</el-button>
  30. </el-form-item>
  31. </el-form>
  32. </div>
  33. <div class="gva-table-box">
  34. <div class="gva-btn-list">
  35. <el-button type="primary" icon="plus" @click="openDialog">查改</el-button>
  36. <el-popover v-model:visible="deleteVisible" :disabled="!multipleSelection.length" placement="top" width="160">
  37. <p>确定要删除吗?</p>
  38. <div style="text-align: right; margin-top: 8px;">
  39. <el-button type="primary" link @click="deleteVisible = false">取消</el-button>
  40. <el-button type="primary" @click="onDelete">确定</el-button>
  41. </div>
  42. <template #reference>
  43. <el-button icon="delete" style="margin-left: 10px;" :disabled="!multipleSelection.length" @click="deleteVisible = true">删除</el-button>
  44. </template>
  45. </el-popover>
  46. </div>
  47. <el-table
  48. :data="tableData"
  49. height="300"
  50. border
  51. highlight-current-row
  52. show-summary
  53. @current-change="handleCurrentChange"
  54. @row-dblclick="dbSelected"
  55. style="width: 100%">
  56. <el-table-column
  57. prop="sys_id"
  58. label="创建用户"
  59. width="180">
  60. </el-table-column>
  61. <el-table-column
  62. prop="sczl_rq"
  63. label="日期"
  64. width="180">
  65. </el-table-column>
  66. <el-table-column
  67. sortable
  68. prop="sczl_cl"
  69. label="包装产量"
  70. width="180">
  71. </el-table-column>
  72. <el-table-column
  73. sortable
  74. prop="sczl_PgCl"
  75. label="包装数量"
  76. width="180">
  77. </el-table-column>
  78. <el-table-column
  79. prop="sys_rq"
  80. label="创建时间"
  81. width="180">
  82. </el-table-column>
  83. <el-table-column
  84. prop="mod_rq"
  85. label="修改时间"
  86. width="180">
  87. </el-table-column>
  88. <el-table-column
  89. sum-text
  90. prop="UniqId"
  91. label="UniqId"
  92. width="180">
  93. </el-table-column>
  94. </el-table>
  95. <div class="gva-pagination">
  96. <el-pagination
  97. layout="total, sizes, prev, pager, next, jumper"
  98. :current-page="page"
  99. :page-size="limit"
  100. :page-sizes="[10, 30, 50, 100]"
  101. :total="total"
  102. @current-change="handleCurrentChange"
  103. @size-change="handleSizeChange"
  104. />
  105. </div>
  106. </div>
  107. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="type==='create'?'添加':'修改'" destroy-on-close>
  108. <el-scrollbar height="500px">
  109. <el-form :model="formData" label-position="right" ref="elFormRef" :rules="rule" label-width="80px">
  110. <el-form-item label="address字段:" prop="address" >
  111. <el-input v-model="formData.address" :clearable="true" placeholder="请输入address字段" />
  112. </el-form-item>
  113. <el-form-item label="image字段:" prop="image" >
  114. <el-input v-model="formData.image" :clearable="true" placeholder="请输入image字段" />
  115. </el-form-item>
  116. <el-form-item label="name字段:" prop="name" >
  117. <el-input v-model="formData.name" :clearable="true" placeholder="请输入name字段" />
  118. </el-form-item>
  119. </el-form>
  120. </el-scrollbar>
  121. <template #footer>
  122. <div class="dialog-footer">
  123. <el-button @click="closeDialog">取 消</el-button>
  124. <el-button type="primary" @click="enterDialog">确 定</el-button>
  125. </div>
  126. </template>
  127. </el-dialog>
  128. <el-dialog v-model="detailShow" style="width: 800px" lock-scroll :before-close="closeDetailShow" title="查看详情" destroy-on-close>
  129. <el-scrollbar height="550px">
  130. <el-descriptions column="1" border>
  131. <el-descriptions-item label="address字段">
  132. {{ formData.address }}
  133. </el-descriptions-item>
  134. <el-descriptions-item label="image字段">
  135. {{ formData.image }}
  136. </el-descriptions-item>
  137. <el-descriptions-item label="name字段">
  138. {{ formData.name }}
  139. </el-descriptions-item>
  140. </el-descriptions>
  141. </el-scrollbar>
  142. </el-dialog>
  143. </el-main>
  144. </el-container>
  145. </el-container>
  146. </div>
  147. </template>
  148. <script setup>
  149. import {
  150. createCompany,
  151. deleteCompany,
  152. deleteCompanyByIds,
  153. updateCompany,
  154. findCompany,
  155. getCompanyList
  156. } from '@/api/company'
  157. import {
  158. getList,
  159. getTab
  160. } from '@/api/jixiaoguanli/jitairibaobiao'
  161. // 全量引入格式化工具 请按需保留
  162. import { getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile } from '@/utils/format'
  163. import { ElMessage, ElMessageBox } from 'element-plus'
  164. import { ref, reactive } from 'vue'
  165. defineOptions({
  166. name: 'Company'
  167. })
  168. // 左侧树形结构
  169. const treeData = reactive([])
  170. const getTabdata = async () => {
  171. //接口调用函数
  172. const response = await getTab();
  173. console.log(response)
  174. const transformedData = response.data.map(item => ({
  175. label: `${item.date.replace(/-/g, '.')}【单据数: ${item.counts}张】`,
  176. children: item.sys.map(sysItem => ({
  177. label: `${sysItem.sys_id} 【记录数: ${sysItem.count}张】`,
  178. params: {
  179. date: item.date.replace(/\./g, '-'),
  180. sys_id: sysItem.sys_id,
  181. total: sysItem.count,
  182. },
  183. })),
  184. }));
  185. treeData.splice(0, treeData.length, ...transformedData);
  186. }
  187. // if(data.code === 0){
  188. // treeData.value = data.data
  189. // console.log(treeData)
  190. // }else {
  191. // console.error('Error in getDepartment:', data.msg);
  192. // }
  193. getTabdata();
  194. // 自动化生成的字典(可能为空)以及字段
  195. const formData = ref({
  196. worknum: '',
  197. dailyquota: '',
  198. name: '',
  199. })
  200. // 验证规则
  201. const rule = reactive({
  202. })
  203. const searchRule = reactive({
  204. createdAt: [
  205. { validator: (rule, value, callback) => {
  206. if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
  207. callback(new Error('请填写结束日期'))
  208. } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
  209. callback(new Error('请填写开始日期'))
  210. } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
  211. callback(new Error('开始日期应当早于结束日期'))
  212. } else {
  213. callback()
  214. }
  215. }, trigger: 'change' }
  216. ],
  217. })
  218. const elFormRef = ref()
  219. const elSearchFormRef = ref()
  220. // =========== 表格控制部分 ===========
  221. const page = ref(1)
  222. const total = ref(0)
  223. const limit = ref(10)
  224. const tableData = reactive([])
  225. const searchInfo = ref({})
  226. const params = {
  227. date: '',
  228. sys_id: '',
  229. page: page.value.toString(),
  230. limit: limit.value.toString(),
  231. }
  232. // 重置
  233. const onReset = () => {
  234. searchInfo.value = {}
  235. getTableData()
  236. }
  237. // 搜索
  238. const onSubmit = () => {
  239. elSearchFormRef.value?.validate(async(valid) => {
  240. if (!valid) return
  241. page.value = 1
  242. limit.value = 10
  243. getTableData()
  244. })
  245. }
  246. // 分页
  247. const handleSizeChange = (val) => {
  248. limit.value = val
  249. getTableData()
  250. }
  251. // 修改页面容量
  252. const handleCurrentChange = (val) => {
  253. page.value = val
  254. getTableData()
  255. }
  256. // 查询
  257. const getTableData = async () => {
  258. const response = await getList(params);
  259. console.log(response)
  260. if (response.code === 0) {
  261. tableData.splice(0, tableData.length, ...response.data.rows);
  262. }
  263. }
  264. // getTableData()
  265. const handleNodeClick = (node, check) => {
  266. //存放当前节点的nodeId
  267. if (node.params) {
  268. params.date = node.params.date;
  269. params.sys_id = node.params.sys_id;
  270. total.value = node.params.total;
  271. getTableData();
  272. }
  273. }
  274. // ============== 表格控制部分结束 ===============
  275. // 获取需要的字典 可能为空 按需保留
  276. const setOptions = async () =>{
  277. }
  278. // 获取需要的字典 可能为空 按需保留
  279. setOptions()
  280. // 多选数据
  281. const multipleSelection = ref([])
  282. // 多选
  283. const handleSelectionChange = (val) => {
  284. multipleSelection.value = val
  285. }
  286. // 删除行
  287. const deleteRow = (row) => {
  288. ElMessageBox.confirm('确定要删除吗?', '提示', {
  289. confirmButtonText: '确定',
  290. cancelButtonText: '取消',
  291. type: 'warning'
  292. }).then(() => {
  293. deleteCompanyFunc(row)
  294. })
  295. }
  296. // 批量删除控制标记
  297. const deleteVisible = ref(false)
  298. // 多选删除
  299. const onDelete = async() => {
  300. const ids = []
  301. if (multipleSelection.value.length === 0) {
  302. ElMessage({
  303. type: 'warning',
  304. message: '请选择要删除的数据'
  305. })
  306. return
  307. }
  308. multipleSelection.value &&
  309. multipleSelection.value.map(item => {
  310. ids.push(item.ID)
  311. })
  312. const res = await deleteCompanyByIds({ ids })
  313. if (res.code === 0) {
  314. ElMessage({
  315. type: 'success',
  316. message: '删除成功'
  317. })
  318. if (tableData.value.length === ids.length && page.value > 1) {
  319. page.value--
  320. }
  321. deleteVisible.value = false
  322. getTableData()
  323. }
  324. }
  325. // 行为控制标记(弹窗内部需要增还是改)
  326. const type = ref('')
  327. // 更新行
  328. const updateCompanyFunc = async(row) => {
  329. const res = await findCompany({ ID: row.ID })
  330. type.value = 'update'
  331. if (res.code === 0) {
  332. formData.value = res.data.recompany
  333. dialogFormVisible.value = true
  334. }
  335. }
  336. // 删除行
  337. const deleteCompanyFunc = async (row) => {
  338. const res = await deleteCompany({ ID: row.ID })
  339. if (res.code === 0) {
  340. ElMessage({
  341. type: 'success',
  342. message: '删除成功'
  343. })
  344. if (tableData.value.length === 1 && page.value > 1) {
  345. page.value--
  346. }
  347. getTableData()
  348. }
  349. }
  350. // 弹窗控制标记
  351. const dialogFormVisible = ref(false)
  352. // 查看详情控制标记
  353. const detailShow = ref(false)
  354. // 打开详情弹窗
  355. const openDetailShow = () => {
  356. detailShow.value = true
  357. }
  358. // 打开详情
  359. const getDetails = async (row) => {
  360. // 打开弹窗
  361. const res = await findCompany({ ID: row.ID })
  362. if (res.code === 0) {
  363. formData.value = res.data.recompany
  364. openDetailShow()
  365. }
  366. }
  367. // 关闭详情弹窗
  368. const closeDetailShow = () => {
  369. detailShow.value = false
  370. formData.value = {
  371. address: '',
  372. image: '',
  373. name: '',
  374. }
  375. }
  376. // 打开弹窗
  377. const openDialog = () => {
  378. type.value = 'create'
  379. dialogFormVisible.value = true
  380. }
  381. const dbSelected = () => {
  382. type.value = 'create'
  383. dialogFormVisible.value = true
  384. }
  385. // 关闭弹窗
  386. const closeDialog = () => {
  387. dialogFormVisible.value = false
  388. formData.value = {
  389. address: '',
  390. image: '',
  391. name: '',
  392. }
  393. }
  394. // 弹窗确定
  395. const enterDialog = async () => {
  396. elFormRef.value?.validate( async (valid) => {
  397. if (!valid) return
  398. let res
  399. switch (type.value) {
  400. case 'create':
  401. res = await createCompany(formData.value)
  402. break
  403. case 'update':
  404. res = await updateCompany(formData.value)
  405. break
  406. default:
  407. res = await createCompany(formData.value)
  408. break
  409. }
  410. if (res.code === 0) {
  411. ElMessage({
  412. type: 'success',
  413. message: '创建/更改成功'
  414. })
  415. closeDialog()
  416. getTableData()
  417. }
  418. })
  419. }
  420. </script>
  421. <style>
  422. .JKWTree-container {
  423. display: flex;
  424. }
  425. .JKWTree-tree {
  426. width: 300px;
  427. background-color: #fff;
  428. padding: 10px;
  429. margin-right: 20px;
  430. }
  431. .JKWTree-tree h3 {
  432. font-size: 15px;
  433. font-weight: 700;
  434. margin: 10px 0;
  435. }
  436. .JKWTree-content {
  437. flex: 1;
  438. }
  439. </style>