index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <template>
  2. <HcCard>
  3. <template #header>
  4. <div class="w-36">
  5. <el-select v-model="searchForm.orgDept" block clearable placeholder="选择部门" size="large" @change="changeDpet">
  6. <el-option v-for="item in department" :label="item.deptName" :value="item.id" />
  7. </el-select>
  8. </div>
  9. <div class="w-36 ml-2">
  10. <el-select v-model="searchForm.userId" block clearable placeholder="选择人员" size="large">
  11. <el-option v-for="item in departmentPeople" :label="item.name" :value="item.id" />
  12. </el-select>
  13. </div>
  14. <div class="w-36 ml-4">
  15. <el-date-picker v-model="searchForm.startTime" class="block" type="month" value-format="YYYY-MM" placeholder="开始日期" clearable size="large" />
  16. </div>
  17. <div class="mx-2">
  18. ~
  19. </div>
  20. <div class="w-36">
  21. <el-date-picker v-model="searchForm.endTime" class="block" type="month" value-format="YYYY-MM" placeholder="结束日期" clearable size="large" />
  22. </div>
  23. <div class="ml-4">
  24. <el-button size="large" type="primary" @click="searchClick">
  25. <HcIcon name="search-2" />
  26. <span>搜索</span>
  27. </el-button>
  28. </div>
  29. <div class="ml-2">
  30. <el-button size="large" @click="resetClick">
  31. <HcIcon name="close-circle" />
  32. <span>重置</span>
  33. </el-button>
  34. </div>
  35. </template>
  36. <template #extra>
  37. <el-button v-if="isEditState" size="large" type="warning" @click="submitLogsClick">
  38. <HcIcon name="check-double" />
  39. <span>提交日志</span>
  40. </el-button>
  41. <template v-else>
  42. <el-button v-if="!isShowEdit" size="large" type="primary" @click="editLogsClick">
  43. <HcIcon name="add" />
  44. <span>写日志</span>
  45. </el-button>
  46. <!-- 修改自己的日志 -->
  47. <el-button v-else size="large" type="primary" @click="editmyLog">
  48. <HcIcon name="add" />
  49. <span>写日志</span>
  50. </el-button>
  51. </template>
  52. <el-button v-if="isEditState" size="large" type="primary" @click="gobackLog">
  53. <HcIcon name="arrow-go-back" />
  54. <span>取消</span>
  55. </el-button>
  56. </template>
  57. <div class="hac-logs-main-body">
  58. <div class="hac-logs-user-list-body">
  59. <HcCardItem scrollbar>
  60. <div v-for="(item, key) in userList" class="hac-user-list-item">
  61. <div class="label">
  62. {{ key }}
  63. </div>
  64. <template v-for="items in item">
  65. <div class="user-item" :class="userItemId.id === items.id ? 'cur' : ''" @click="userItemClick(items)">
  66. <img class="avatar" :src="items?.headPicture || avatarPng" alt="">
  67. <div class="name">
  68. {{ items?.logTitle }}
  69. </div>
  70. <div v-if="items?.isEdit === 0" class="state">
  71. <span v-if="items?.isRead === 0" class="text-xl text-red mr-2">
  72. <HcIcon name="alarm-warning" />
  73. </span>
  74. <span>{{ items?.isRead === 0 ? '未读' : '已读' }}</span>
  75. </div>
  76. </div>
  77. </template>
  78. </div>
  79. </HcCardItem>
  80. </div>
  81. <div v-loading="logLoading" class="hac-logs-content-body">
  82. <HcLogsContent v-if="isEditState" ref="logsRef" :data="logForm" :is-showmy-edit="isShowEdit" />
  83. <HcLogsContent v-else :data="logDetail" :edit="false" :undefined-num="undefinedNum" />
  84. </div>
  85. </div>
  86. </HcCard>
  87. </template>
  88. <script setup>
  89. import { onActivated, ref } from 'vue'
  90. import logsApi from '~api/task/logs'
  91. import { useAppStore } from '~src/store'
  92. import { getArrValue, getObjValue, isArray } from 'js-fast-way'
  93. import HcLogsContent from './components/logs-content.vue'
  94. import avatarPng from '~src/assets/images/avatar.png'
  95. import dayjs from 'dayjs'
  96. import { getdepartmentList, getuserList } from '~api/other'
  97. const useAppState = useAppStore()
  98. const userInfo = ref(useAppState.getUserInfo)
  99. const isShowEdit = ref(false)//编辑自己的日志
  100. // 调用时机为首次挂载, 以及每次从缓存中被重新插入时
  101. onActivated(() => {
  102. isEditState.value = false
  103. getLogList()
  104. getDepartmentDict()
  105. getUserDict()
  106. })
  107. const department = ref([])
  108. //获取部门列表
  109. const getDepartmentDict = async ()=>{
  110. const { error, code, data } = await getdepartmentList({ deptType:2 })
  111. if (!error && code === 200) {
  112. department.value = getArrValue(data)
  113. } else {
  114. department.value = []
  115. }
  116. }
  117. //改变部门
  118. const changeDpet = (val)=>{
  119. getDepartmentuserDict(val)
  120. }
  121. const departmentPeople = ref([])
  122. //获取部门人员列表
  123. const getDepartmentuserDict = async (id)=>{
  124. const { error, code, data } = await getuserList({ deptId:id })
  125. if (!error && code === 200) {
  126. departmentPeople.value = getArrValue(data)
  127. } else {
  128. departmentPeople.value = []
  129. }
  130. }
  131. //获取所有员工
  132. const getUserDict = async ()=>{
  133. const { error, code, data } = await getuserList({ tenantId:useAppState.tenantId })
  134. if (!error && code === 200) {
  135. departmentPeople.value = getArrValue(data)
  136. } else {
  137. departmentPeople.value = []
  138. }
  139. }
  140. //搜索表单
  141. const searchForm = ref({ orgDept: null, userId: null, startTime: null, endTime: null })
  142. //搜索
  143. const searchClick = () => {
  144. if (!isEditState.value) {
  145. getLogList()
  146. } else {
  147. window.$message?.warning('请先提交日志或退出填写日志状态')
  148. }
  149. }
  150. //重置
  151. const resetClick = () => {
  152. searchForm.value = {}
  153. getLogList()
  154. }
  155. //日志填报列表查询
  156. const userList = ref({})
  157. const getLogList = async () => {
  158. const { error, code, data, msg } = await logsApi.getLogList(searchForm.value)
  159. //判断状态
  160. if (!error && code === 200) {
  161. const res = getObjValue(data)
  162. userList.value = res
  163. //默认选择第一个
  164. Object.keys(res).forEach((key, index) => {
  165. if (index === 0) {
  166. userItemId.value = res[key][0]
  167. }
  168. })
  169. getLogDetail()
  170. } else {
  171. userList.value = {}
  172. userItemId.value = {}
  173. window.$message?.error(msg)
  174. }
  175. }
  176. //用户列表点击
  177. const userItemId = ref({})
  178. const userItemClick = (item) => {
  179. if (!isEditState.value) {
  180. userItemId.value = item
  181. isShowEdit.value = false
  182. item.isRead = 1
  183. getLogDetail()
  184. } else {
  185. window.$message?.warning('请先提交日志或退出填写日志状态')
  186. }
  187. }
  188. //日志填报详情
  189. const logDetail = ref({})
  190. const undefinedNum = ref(null)
  191. const getLogDetail = async () => {
  192. const item = userItemId.value
  193. if (item.id) {
  194. const { error, code, data, msg } = await logsApi.getLogDetail({
  195. id: item.id,
  196. })
  197. //判断状态
  198. if (!error && code === 200) {
  199. logDetail.value = getObjValue(data)
  200. const { real_name, avatar } = userInfo.value
  201. let logTitle = logDetail.value['logTitle']
  202. console.log(logTitle, 'logTitle')
  203. let index = logTitle.lastIndexOf('的')
  204. let str = logTitle.substring(0, index)
  205. //判断是否编辑自己的日志
  206. if (real_name === str) {
  207. isShowEdit.value = true
  208. }
  209. } else {
  210. logDetail.value = {}
  211. window.$message?.error(msg)
  212. }
  213. //计算未完成数量
  214. console.log(logDetail.value.taskList, 'taskList')
  215. let arr = []
  216. if (isArray(logDetail.value?.taskList)) {
  217. // eslint-disable-next-line array-callback-return
  218. arr = logDetail.value?.taskList.filter((ele)=>{
  219. // eslint-disable-next-line eqeqeq
  220. if (ele?.isOverdue == 1) {
  221. return ele
  222. }
  223. })
  224. }
  225. undefinedNum.value = arr.length
  226. console.log( undefinedNum.value, ' undefinedNum.value')
  227. }
  228. }
  229. //日志填报表单
  230. const logForm = ref({
  231. headPicture: '',
  232. logTitle: '',
  233. createTime: '',
  234. riskWarning: '',
  235. workDesc: '',
  236. expenseReimbursementAmount: '',
  237. })
  238. //当前状态,false查看模式,true写日志模式
  239. const isEditState = ref(false)
  240. const editLogsClick = () => {
  241. console.log('写日志')
  242. logForm.value = {
  243. headPicture: '',
  244. logTitle: '',
  245. createTime: '',
  246. riskWarning: '',
  247. workDesc: '',
  248. expenseReimbursementAmount: '',
  249. }
  250. const { real_name, avatar } = userInfo.value
  251. isEditState.value = true
  252. logForm.value.headPicture = avatar || avatarPng
  253. logForm.value.logTitle = real_name + '的日志'
  254. logForm.value.createTime = dayjs().format('YYYY-MM-DD')
  255. }
  256. //修改自己的日志
  257. const editmyLog = ()=>{
  258. console.log('修改自己的')
  259. isEditState.value = true
  260. logForm.value = logDetail.value
  261. }
  262. //返回到查看日志界面
  263. const gobackLog = ()=>{
  264. isEditState.value = false
  265. isShowEdit.value = false
  266. }
  267. const logsRef = ref(null)
  268. const logLoading = ref(false)
  269. const submitLogsClick = async () => {
  270. logLoading.value = true
  271. const form = logsRef.value?.getLogForm()
  272. //移除不必要的字段
  273. delete form.createTime
  274. delete form.headPicture
  275. delete form.logTitle
  276. //发起请求
  277. const { error, code, msg } = await logsApi.setLogSubmit(form)
  278. //判断状态
  279. logLoading.value = false
  280. if (!error && code === 200) {
  281. isEditState.value = false
  282. getLogList()
  283. } else {
  284. window.$message?.error(msg)
  285. }
  286. }
  287. </script>
  288. <style lang="scss" scoped>
  289. @import "~src/styles/task/logs.scoped.scss";
  290. </style>