EarnPoints.vue 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258
  1. <template>
  2. <div class="right-wrap">
  3. <div class="myTabs" style="background: #fff;min-height: 500px;">
  4. <el-tabs style="padding: 0 20px 40px 20px;" v-model="activeName" @tab-click="handleClick">
  5. <el-tab-pane label="证书列表" name="first">
  6. <el-button size="small" type="primary" @click="dialogVisible = true">上传证书</el-button>
  7. <el-table size="small" :data="dataList" border style="margin-top: 20px;width: 960px">
  8. <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
  9. <el-table-column align="center" min-width="200" label="附件">
  10. <template slot-scope="props">
  11. <div v-for="(item, index) in props.row.files" :key="index">
  12. <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
  13. </div>
  14. </template>
  15. </el-table-column>
  16. <el-table-column min-width="100" align="center" prop="typeName" label="证书大类"></el-table-column>
  17. <el-table-column align="center" prop="categoryName" min-width="100" label="证书类型"></el-table-column>
  18. <el-table-column align="center" prop="title" min-width="100" label="证书名称"></el-table-column>
  19. <el-table-column align="center" prop="integral" min-width="100" label="积分"></el-table-column>
  20. <el-table-column min-width="60" align="center" prop="statusName" label="状态"></el-table-column>
  21. <el-table-column min-width="150" align="center" prop="createTime" label="上传时间"></el-table-column>
  22. <el-table-column min-width="80" align="center" label="备注">
  23. <template slot-scope="props">
  24. <el-popover width="200" trigger="hover" :content="props.row.content">
  25. <div slot="reference" class="text-overflow">{{ props.row.content }}</div>
  26. </el-popover>
  27. </template>
  28. </el-table-column>
  29. </el-table>
  30. <!-- 分页 -->
  31. <div class="myPage">
  32. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  33. :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
  34. layout="total, sizes, prev, pager, next, jumper" :total="total">
  35. </el-pagination>
  36. </div>
  37. </el-tab-pane>
  38. <el-tab-pane label="表彰列表" name="third">
  39. <el-button size="small" type="primary" @click="handleClickCreate('上传表彰')">上传表彰</el-button>
  40. <el-table size="small" :data="dataListCite" border style="margin-top: 20px;width: 960px">
  41. <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
  42. <el-table-column align="center" min-width="200" label="附件">
  43. <template slot-scope="props">
  44. <div v-for="(item, index) in props.row.files" :key="index">
  45. <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
  46. </div>
  47. </template>
  48. </el-table-column>
  49. <el-table-column align="center" prop="typeName" min-width="80" label="表彰类型"></el-table-column>
  50. <el-table-column align="center" min-width="100" label="表彰人员">
  51. <template slot-scope="props">
  52. <el-popover trigger="hover">
  53. <el-table :data="props.row.groupUsers" border size="mini">
  54. <el-table-column min-width="200" align="center" prop="deptName" label="部门"></el-table-column>
  55. <el-table-column min-width="100" align="center" prop="userName" label="姓名"></el-table-column>
  56. <el-table-column min-width="100" align="center" prop="employeNo" label="员工号"></el-table-column>
  57. </el-table>
  58. <span style="color: #1e80ff;cursor: pointer;" slot="reference">
  59. {{ props.row.userName }}
  60. </span>
  61. </el-popover>
  62. </template>
  63. </el-table-column>
  64. <el-table-column align="center" min-width="100" label="客户名称">
  65. <template slot-scope="props">
  66. <el-popover width="200" trigger="hover" :content="props.row.customerName">
  67. <div slot="reference" class="text-overflow">{{ props.row.customerName }}</div>
  68. </el-popover>
  69. </template>
  70. </el-table-column>
  71. <el-table-column align="center" min-width="100" label="表彰名称">
  72. <template slot-scope="props">
  73. <el-popover width="200" trigger="hover" :content="props.row.title">
  74. <div slot="reference" class="text-overflow">{{ props.row.title }}</div>
  75. </el-popover>
  76. </template>
  77. </el-table-column>
  78. <el-table-column min-width="100" align="center" label="表彰描述">
  79. <template slot-scope="props">
  80. <el-popover width="400" trigger="hover" :content="props.row.content">
  81. <div slot="reference" class="text-overflow">{{ props.row.content }}</div>
  82. </el-popover>
  83. </template>
  84. </el-table-column>
  85. <el-table-column min-width="100" align="center" label="状态">
  86. <template slot-scope="props">
  87. <el-popover trigger="hover">
  88. <el-table :data="props.row.logs" border size="mini">
  89. <el-table-column min-width="120" align="center" prop="auditor" label="处理人"></el-table-column>
  90. <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
  91. <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
  92. </el-table>
  93. <span style="color: #1e80ff;cursor: pointer;" slot="reference">{{ props.row.statusName }}</span>
  94. </el-popover>
  95. </template>
  96. </el-table-column>
  97. <el-table-column min-width="120" align="center" prop="createTime" label="上传时间"></el-table-column>
  98. <el-table-column fixed="right" align="center" label="操作" width="160px" class-name="small-padding fixed-width">
  99. <template slot-scope="scope">
  100. <el-button type="primary" size="small" @click="handleClickViewCite(scope.row, 'view')">查看</el-button>
  101. <el-button v-if="scope.row.status=='12' || scope.row.status=='22'" type="success" size="small" @click="handleClickViewCite(scope.row, 'edit')">修改</el-button>
  102. </template>
  103. </el-table-column>
  104. </el-table>
  105. <div class="myPage">
  106. <el-pagination @size-change="handleSizeChangeCite" @current-change="handleCurrentChangeCite"
  107. :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
  108. layout="total, sizes, prev, pager, next, jumper" :total="totalCite">
  109. </el-pagination>
  110. </div>
  111. </el-tab-pane>
  112. <el-tab-pane label="培训列表" name="fourth">
  113. <el-button size="small" type="primary" @click="handleClickCreate('上传培训')">上传培训</el-button>
  114. <el-table size="small" :data="dataListTrain" border style="margin-top: 20px;width: 960px">
  115. <el-table-column align="center" type="index" width="50" label="序号"></el-table-column>
  116. <el-table-column align="center" prop="title" min-width="100" label="培训主题">
  117. </el-table-column>
  118. <el-table-column align="center" prop="startTime" min-width="150" label="开始时间">
  119. </el-table-column>
  120. <el-table-column align="center" prop="endTime" min-width="150" label="结束时间">
  121. </el-table-column>
  122. <el-table-column min-width="100" align="center" label="状态">
  123. <template slot-scope="props">
  124. <el-popover trigger="hover">
  125. <el-table :data="props.row.trainLogs" border size="mini">
  126. <el-table-column min-width="120" align="center" prop="auditor" label="处理人"></el-table-column>
  127. <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
  128. <!-- <el-table-column min-width="120" align="center" prop="statusName" label="状态"></el-table-column> -->
  129. <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
  130. </el-table>
  131. <span style="color: #1e80ff;cursor: pointer;" slot="reference">{{ props.row.statusName }}</span>
  132. </el-popover>
  133. </template>
  134. </el-table-column>
  135. <el-table-column align="center" prop="lecturerName" min-width="150" label="培训讲师">
  136. </el-table-column>
  137. <el-table-column align="center" min-width="100" label="参加人员">
  138. <template slot-scope="props">
  139. <el-popover trigger="hover">
  140. <el-table :data="props.row.trainees" border size="mini">
  141. <el-table-column min-width="200" align="center" prop="deptName" label="部门"></el-table-column>
  142. <el-table-column min-width="100" align="center" prop="userName" label="姓名"></el-table-column>
  143. <el-table-column min-width="100" align="center" prop="employeNo" label="员工号"></el-table-column>
  144. </el-table>
  145. <span style="color: #1e80ff;cursor: pointer;" slot="reference">
  146. {{ props.row.trainees[0].userName }}
  147. </span>
  148. </el-popover>
  149. </template>
  150. </el-table-column>
  151. <el-table-column min-width="100" align="center" label="培训描述">
  152. <template slot-scope="props">
  153. <el-popover width="400" trigger="hover" :content="props.row.content">
  154. <div slot="reference" class="text-overflow">{{ props.row.content }}</div>
  155. </el-popover>
  156. </template>
  157. </el-table-column>
  158. <el-table-column align="center" min-width="200" label="培训材料">
  159. <template slot-scope="props">
  160. <div v-for="(item, index) in props.row.materialFiles" :key="index">
  161. <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
  162. </div>
  163. </template>
  164. </el-table-column>
  165. <el-table-column align="center" min-width="200" label="签到表照片">
  166. <template slot-scope="props">
  167. <div v-for="(item, index) in props.row.signPhotoFiles" :key="index">
  168. <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
  169. </div>
  170. </template>
  171. </el-table-column>
  172. <el-table-column align="center" min-width="200" label="现场照片">
  173. <template slot-scope="props">
  174. <div v-for="(item, index) in props.row.sitePhotoFiles" :key="index">
  175. <a style="color: #1e80ff;" target="_blank" :href="item.url">{{ item.oldName }}</a>
  176. </div>
  177. </template>
  178. </el-table-column>
  179. <el-table-column min-width="150" align="center" prop="createTime" label="上传时间"></el-table-column>
  180. <el-table-column fixed="right" align="center" label="操作" width="160px" class-name="small-padding fixed-width">
  181. <template slot-scope="scope">
  182. <el-button type="primary" size="small" @click="handleClickView(scope.row, 'view')">查看</el-button>
  183. <el-button v-if="scope.row.status=='21' || scope.row.status=='31'" type="success" size="small" @click="handleClickView(scope.row, 'edit')">修改</el-button>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <!-- 分页 -->
  188. <div class="myPage">
  189. <el-pagination @size-change="handleSizeChangeTrain" @current-change="handleCurrentChangeTrain"
  190. :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="10"
  191. layout="total, sizes, prev, pager, next, jumper" :total="totalTrain">
  192. </el-pagination>
  193. </div>
  194. </el-tab-pane>
  195. <el-tab-pane label="证书积分规则" name="second">
  196. <el-empty v-if="!integralRules" :image-size="200"></el-empty>
  197. <div v-else v-html="integralRules"></div>
  198. </el-tab-pane>
  199. <el-tab-pane label="积分充值" name="fifth">
  200. <Ipay></Ipay>
  201. </el-tab-pane>
  202. </el-tabs>
  203. </div>
  204. <el-dialog title="上传证书" :visible.sync="dialogVisible" width="40%">
  205. <el-form :rules="rules" ref="dataForm" :model="dataForm" label-width="100px">
  206. <el-form-item label="证书类别:" prop="type">
  207. <el-cascader clearable size="small" style="width: 95%;" v-model="dataForm.type" :options="typeList"
  208. :props="{ value: 'id', label: 'typeName', children: 'children' }" @change="handleChange"></el-cascader>
  209. </el-form-item>
  210. <el-form-item label="证书名称:" prop="title">
  211. <el-input clearable style="width: 95%;" size="small" v-model="dataForm.title"></el-input>
  212. </el-form-item>
  213. <el-form-item label="证书附件:" prop="fileIds">
  214. <el-upload :action="fileUrl" :file-list="dataForm.files" :on-success="handleAvatarSuccess"
  215. :before-upload="beforeUploadFile" :on-remove="handleRemove">
  216. <el-button size="small" type="primary">点击上传</el-button>
  217. </el-upload>
  218. </el-form-item>
  219. </el-form>
  220. <span slot="footer" class="dialog-footer">
  221. <el-button size="small" type="primary" @click="submitForm">确 定</el-button>
  222. </span>
  223. </el-dialog>
  224. <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogVisibleCite" width="40%">
  225. <el-form :rules="rulesCite" ref="dataFormCite" :model="dataFormCite" label-width="100px">
  226. <el-form-item label="表彰类型:" prop="type">
  227. <el-select :disabled="dialogStatus=='view'?true:false" clearable size="small" style="width: 95%;" v-model="dataFormCite.type" placeholder="请选择表彰类型">
  228. <el-option v-for="item in typeListCite" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue">
  229. </el-option>
  230. </el-select>
  231. </el-form-item>
  232. <el-form-item v-if="dataFormCite.type == '1'" label="集体人员:" prop="groupIds">
  233. <el-select :disabled="dialogStatus=='view'?true:false" size="small" v-model="dataFormCite.groupIds" multiple filterable placeholder="请选择(支持输入姓名检索)"
  234. style="width: 95%;">
  235. <el-option :key="item.loginId" v-for="item in recipientsList"
  236. :label="item.deptName + '_' + item.userName + '_' + item.employeNo" :value="item.loginId">
  237. </el-option>
  238. </el-select>
  239. </el-form-item>
  240. <el-form-item label="客户名称:" prop="customerName">
  241. <el-input :disabled="dialogStatus=='view'?true:false" clearable style="width: 95%;" size="small" v-model="dataFormCite.customerName"></el-input>
  242. </el-form-item>
  243. <el-form-item label="表彰名称:" prop="title">
  244. <el-input :disabled="dialogStatus=='view'?true:false" clearable style="width: 95%;" size="small" v-model="dataFormCite.title"></el-input>
  245. </el-form-item>
  246. <el-form-item label="表彰描述:" prop="content">
  247. <el-input :disabled="dialogStatus=='view'?true:false" type="textarea" :rows="5" maxlength="500" show-word-limit style="width: 95%;" size="small"
  248. v-model="dataFormCite.content"></el-input>
  249. </el-form-item>
  250. <el-form-item label="表彰附件:" prop="fileIds">
  251. <el-upload :disabled="dialogStatus=='view'?true:false" :action="fileUrl" :file-list="dataFormCite.files" :on-success="handleAvatarSuccessCite"
  252. :before-upload="beforeUploadFileCite" :on-remove="handleRemoveCite">
  253. <el-button size="small" type="primary">点击上传</el-button>
  254. </el-upload>
  255. </el-form-item>
  256. <el-table v-if="dialogStatus=='create'?false:true" :data="citeLogsList" border size="mini">
  257. <el-table-column min-width="120" align="center" prop="auditor" label="处理人"></el-table-column>
  258. <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
  259. <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
  260. </el-table>
  261. </el-form>
  262. <span v-if="dialogStatus!='view'" slot="footer" class="dialog-footer">
  263. <el-button size="small" type="primary" @click="submitFormCite">确 定</el-button>
  264. </span>
  265. </el-dialog>
  266. <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogVisibleTrain" width="40%">
  267. <el-form :rules="rulesTrain" ref="dataFormTrain" :model="dataFormTrain" label-width="100px">
  268. <el-form-item label="培训主题:" prop="title">
  269. <el-input :disabled="dialogStatus=='view'?true:false" clearable style="width: 95%;" size="small" v-model="dataFormTrain.title"></el-input>
  270. </el-form-item>
  271. <el-form-item label="开始时间:" prop="startTime">
  272. <el-date-picker :disabled="dialogStatus=='view'?true:false" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
  273. v-model="dataFormTrain.startTime" placeholder="请选择开始时间" style="width: 95%">
  274. </el-date-picker>
  275. </el-form-item>
  276. <el-form-item label="结束时间:" prop="endTime">
  277. <el-date-picker :disabled="dialogStatus=='view'?true:false" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
  278. v-model="dataFormTrain.endTime" placeholder="请选择结束时间" style="width: 95%">
  279. </el-date-picker>
  280. </el-form-item>
  281. <el-form-item label="培训讲师:" prop="lecturer">
  282. <el-select :disabled="dialogStatus=='view'?true:false" size="small" v-model="dataFormTrain.lecturer" filterable placeholder="请选择(支持输入姓名检索)" style="width: 95%;">
  283. <el-option :key="item.loginId" v-for="item in recipientsList"
  284. :label="item.deptName + '_' + item.userName + '_' + item.employeNo" :value="item.loginId">
  285. </el-option>
  286. </el-select>
  287. </el-form-item>
  288. <el-form-item label="参加人员:" prop="traineeIds">
  289. <el-select :disabled="dialogStatus=='view'?true:false" size="small" v-model="dataFormTrain.traineeIds" multiple filterable placeholder="请选择(支持输入姓名检索)"
  290. style="width: 95%;">
  291. <el-option :key="item.loginId" v-for="item in recipientsList"
  292. :label="item.deptName + '_' + item.userName + '_' + item.employeNo" :value="item.loginId">
  293. </el-option>
  294. </el-select>
  295. </el-form-item>
  296. <el-form-item label="培训内容:" prop="content">
  297. <el-input :disabled="dialogStatus=='view'?true:false" type="textarea" :rows="5" maxlength="500" show-word-limit style="width: 95%;" size="small"
  298. v-model="dataFormTrain.content"></el-input>
  299. </el-form-item>
  300. <el-form-item label="培训材料:" prop="materials">
  301. <el-upload :disabled="dialogStatus=='view'?true:false" :action="fileUrl" :file-list="dataFormTrain.materialFiles" :on-success="handleAvatarSuccessTrain"
  302. :before-upload="beforeUploadFileTrain" :on-remove="handleRemoveTrain">
  303. <el-button size="small" type="primary">点击上传</el-button>
  304. </el-upload>
  305. </el-form-item>
  306. <el-form-item label="签到表:" prop="signPhotos">
  307. <el-upload :disabled="dialogStatus=='view'?true:false" :action="fileUrl" :file-list="dataFormTrain.signPhotoFiles" :on-success="handleAvatarSuccessTrain1"
  308. :before-upload="beforeUploadFileTrain" :on-remove="handleRemoveTrain1">
  309. <el-button size="small" type="primary">点击上传</el-button>
  310. </el-upload>
  311. </el-form-item>
  312. <el-form-item label="现场照片:" prop="sitePhotos">
  313. <el-upload :disabled="dialogStatus=='view'?true:false" :action="fileUrl" :file-list="dataFormTrain.sitePhotoFiles" :on-success="handleAvatarSuccessTrain2"
  314. :before-upload="beforeUploadFileTrain" :on-remove="handleRemoveTrain2">
  315. <el-button size="small" type="primary">点击上传</el-button>
  316. </el-upload>
  317. </el-form-item>
  318. <el-form-item v-if="dialogStatus!='view'" label="上传说明:">
  319. <el-card shadow="never" style="width: 95%;padding: 0;min-height: 100px;line-height: normal;">
  320. <div v-html="remarkHtml"></div>
  321. </el-card>
  322. </el-form-item>
  323. <el-table v-if="dialogStatus=='create'?false:true" :data="trainLogsList" border size="mini">
  324. <el-table-column min-width="120" align="center" prop="auditor" label="处理人"></el-table-column>
  325. <el-table-column min-width="160" align="center" prop="comment" label="处理结果"></el-table-column>
  326. <el-table-column min-width="180" align="center" prop="createTime" label="处理时间"></el-table-column>
  327. </el-table>
  328. </el-form>
  329. <span v-if="dialogStatus!='view'" slot="footer" class="dialog-footer">
  330. <el-button size="small" type="primary" @click="submitFormTrain">确 定</el-button>
  331. </span>
  332. </el-dialog>
  333. </div>
  334. </template>
  335. <script scoped>
  336. import Ipay from '@/views/Ipay.vue'
  337. import { certificatePage, certificateUpload, notice, certificatType, dictList, allUserList, citeList, uploadCite, editCite, trainList, uploadTrain,editTrain,remarkHtml } from "@/api/allApi";
  338. import { handleTree } from '@/utils/index'
  339. export default {
  340. components: {
  341. Ipay
  342. },
  343. data() {
  344. return {
  345. currentPage: 1,
  346. remarkHtml:'',
  347. citeLogsList:[],
  348. trainLogsList:[],
  349. integralRules: '',
  350. typeList: [],
  351. activeName: 'first',
  352. fileUrl: this.baseUrl,
  353. dataList: [],
  354. dialogVisible: false,
  355. rules: {
  356. type: [{ required: true, message: "请选择证书类别", trigger: "blur" }],
  357. title: [{ required: true, message: "请填写证书名称", trigger: "blur" }],
  358. fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
  359. },
  360. total: 0,
  361. listQuery: {
  362. page: 1,
  363. limit: 10,
  364. },
  365. dataForm: {
  366. type: [],
  367. title: '',
  368. fileIds: '',
  369. files: [],
  370. },
  371. typeListCite: [],
  372. recipientsList: [],
  373. dataListCite: [],
  374. dialogVisibleCite: false,
  375. rulesCite: {
  376. type: [{ required: true, message: "请选择表彰类型", trigger: "blur" }],
  377. groupIds: [{ required: true, message: "请选择集体人员", trigger: "blur" }],
  378. customerName: [{ required: true, message: "请填写客户名称", trigger: "blur" }],
  379. title: [{ required: true, message: "请填写表彰名称", trigger: "blur" }],
  380. fileIds: [{ required: true, message: "请上传附件", trigger: "blur" }],
  381. content: [{ required: true, message: '请填写表彰描述', trigger: 'blur' }],
  382. },
  383. totalCite: 0,
  384. listQueryCite: {
  385. page: 1,
  386. limit: 10,
  387. },
  388. dataFormCite: {
  389. type: '',
  390. groupIds: [],
  391. customerName: '',
  392. title: '',
  393. fileIds: '',
  394. files: [],
  395. content: ''
  396. },
  397. dataListTrain: [],
  398. dialogVisibleTrain: false,
  399. rulesTrain: {
  400. title: [{ required: true, message: "请填写培训主题", trigger: "blur" }],
  401. startTime: [
  402. { required: true, message: "请选开始时间", trigger: "change" },
  403. { validator: this.checkStartTime, trigger: 'change' }
  404. ],
  405. endTime: [
  406. { required: true, message: "请选择结束时间", trigger: "change" },
  407. { validator: this.checkEndTime, trigger: 'change' }
  408. ],
  409. lecturer: [{ required: true, message: "请选择培训讲师", trigger: "blur" }],
  410. traineeIds: [{ required: true, message: "请选择参加人员", trigger: "blur" }],
  411. materials: [{ required: true, message: "请上传培训材料", trigger: "blur" }],
  412. signPhotos: [{ required: true, message: "请上传签到表照片", trigger: "blur" }],
  413. sitePhotos: [{ required: true, message: "请上传现场照片", trigger: "blur" }],
  414. content: [
  415. { required: true, message: '请填写培训内容', trigger: 'blur' },
  416. { min: 50, max: 500, message: '培训内容的描述不得低于50字!', trigger: 'blur' }
  417. ],
  418. },
  419. totalTrain: 0,
  420. listQueryTrain: {
  421. page: 1,
  422. limit: 10,
  423. },
  424. dataFormTrain: {
  425. title: '',
  426. startTime: '',
  427. endTime: '',
  428. lecturer: '',
  429. traineeIds: [],
  430. materialFiles: [],
  431. materials: [],
  432. signPhotoFiles: [],
  433. signPhotos: [],
  434. sitePhotoFiles: [],
  435. sitePhotos: [],
  436. content: '',
  437. },
  438. dialogStatus:'',
  439. textMap: {
  440. create: "上传",
  441. edit: "修改",
  442. view: "详情",
  443. },
  444. };
  445. },
  446. created() {
  447. this.getTypeListCite();
  448. this.getAllUserList();
  449. this.getDataListCite();
  450. this.getDataListTrain();
  451. this.getTypeList();
  452. this.getDataList();
  453. this.getIntegralNotice();
  454. this.getRemarkHtml('trainrule');
  455. },
  456. methods: {
  457. getRemarkHtml(val) {
  458. remarkHtml({ noticeType: val }).then(response => {
  459. console.log(response.data.data);
  460. this.remarkHtml = response.data.data.content
  461. })
  462. },
  463. handleClickCreate(val){
  464. this.dialogStatus = 'create';
  465. if(val=='上传表彰'){
  466. this.dialogVisibleCite = true;
  467. this.dataFormCite = {
  468. type: '',
  469. groupIds: [],
  470. customerName: '',
  471. title: '',
  472. fileIds: '',
  473. files: [],
  474. content: ''
  475. };
  476. }else{
  477. this.dialogVisibleTrain = true;
  478. this.dataFormTrain = {
  479. title: '',
  480. startTime: '',
  481. endTime: '',
  482. lecturer: '',
  483. traineeIds: [],
  484. materialFiles: [],
  485. materials: [],
  486. signPhotoFiles: [],
  487. signPhotos: [],
  488. sitePhotoFiles: [],
  489. sitePhotos: [],
  490. content: '',
  491. };
  492. }
  493. },
  494. handleClickViewCite(row, val) {
  495. this.citeLogsList = row.logs;
  496. if(row.groupUsers && row.groupUsers.length>0){
  497. let groupIds = [];
  498. for (let i in row.groupUsers) {
  499. groupIds.push(row.groupUsers[i].loginId);
  500. }
  501. row.groupIds = groupIds;
  502. }
  503. this.dataFormCite = Object.assign({}, row);
  504. if (row.files) {
  505. let files = row.files;
  506. this.dataFormCite.files = [];
  507. for (let i in files) {
  508. let url = files[i].url;
  509. let name = files[i].oldName;
  510. let id = files[i].id;
  511. this.dataFormCite.files.push({
  512. name: name,
  513. url: url,
  514. response: { error: "0", data: { url: url,id:id } },
  515. });
  516. }
  517. }
  518. this.dialogVisibleCite = true;
  519. this.dialogStatus = val;
  520. },
  521. handleClickView(row, val) {
  522. this.trainLogsList = row.trainLogs;
  523. if(row.trainees && row.trainees.length>0){
  524. let traineeIds = [];
  525. for (let i in row.trainees) {
  526. traineeIds.push(row.trainees[i].loginId);
  527. }
  528. row.traineeIds = traineeIds;
  529. }
  530. this.dataFormTrain = Object.assign({}, row);
  531. if (row.materialFiles) {
  532. let files = row.materialFiles;
  533. this.dataFormTrain.materialFiles = [];
  534. for (let i in files) {
  535. let url = files[i].url;
  536. let name = files[i].oldName;
  537. let id = files[i].id;
  538. this.dataFormTrain.materialFiles.push({
  539. name: name,
  540. url: url,
  541. response: { error: "0", data: { url: url,id:id } },
  542. });
  543. }
  544. }
  545. if (row.signPhotoFiles) {
  546. let files = row.signPhotoFiles;
  547. this.dataFormTrain.signPhotoFiles = [];
  548. for (let i in files) {
  549. let url = files[i].url;
  550. let name = files[i].oldName;
  551. let id = files[i].id;
  552. this.dataFormTrain.signPhotoFiles.push({
  553. name: name,
  554. url: url,
  555. response: { error: "0", data: { url: url,id:id } },
  556. });
  557. }
  558. }
  559. if (row.sitePhotoFiles) {
  560. let files = row.sitePhotoFiles;
  561. this.dataFormTrain.sitePhotoFiles = [];
  562. for (let i in files) {
  563. let url = files[i].url;
  564. let name = files[i].oldName;
  565. let id = files[i].id;
  566. this.dataFormTrain.sitePhotoFiles.push({
  567. name: name,
  568. url: url,
  569. response: { error: "0", data: { url: url,id:id } },
  570. });
  571. }
  572. }
  573. this.dialogVisibleTrain = true;
  574. this.dialogStatus = val;
  575. },
  576. //校验开始时间
  577. checkStartTime(rule, value, callback) {
  578. if (!value) {
  579. callback(new Error("请选择开始时间!"));
  580. } else {
  581. if (this.dataFormTrain.endTime && Date.parse(value) > Date.parse(this.dataFormTrain.endTime)) {
  582. callback(new Error("开始时间必须小于等于结束时间!"))
  583. this.dataFormTrain.startTime = '';
  584. } else {
  585. callback();
  586. }
  587. }
  588. },
  589. //校验结束时间
  590. checkEndTime(rule, value, callback) {
  591. if (!value) {
  592. callback(new Error("请选择结束时间!"));
  593. } else {
  594. if (!this.dataFormTrain.startTime) {
  595. callback(new Error("请选择开始时间!"))
  596. this.dataFormTrain.endTime = '';
  597. } else if (Date.parse(this.dataFormTrain.startTime) > Date.parse(value)) {
  598. callback(new Error("结束时间必须大于等于开始时间!"))
  599. this.dataFormTrain.endTime = '';
  600. } else {
  601. callback();
  602. }
  603. }
  604. },
  605. getTypeList() {
  606. certificatType().then(response => {
  607. this.typeList = handleTree(response.data.data);
  608. console.log(this.typeList);
  609. })
  610. },
  611. handleClick(tab, event) {
  612. console.log(tab.name, event);
  613. },
  614. getIntegralNotice() {
  615. notice({ noticeType: 'certificatNotice' }).then(response => {
  616. this.integralRules = response.data.data.content;
  617. })
  618. },
  619. handleChange(value) {
  620. console.log(value);
  621. },
  622. handleRemove(file, fileList) {
  623. console.log(file, fileList);
  624. let fileIds = [];
  625. for (let i in fileList) {
  626. let id = fileList[i].response.data.id;
  627. fileIds.push(id);
  628. }
  629. this.dataForm.fileIds = fileIds.join(",");
  630. },
  631. beforeUploadFile(file) {
  632. console.log(file);
  633. const size = file.size / 1024 / 1024;
  634. console.log(size);
  635. if (size > 10) {
  636. this.$message.error("文件大小不能超过10MB!");
  637. return false;
  638. }
  639. },
  640. handleAvatarSuccess(res, file, fileList) {
  641. console.log(file, fileList);
  642. console.log("------", "==========");
  643. console.log("res = ", res);
  644. let fileIds = [];
  645. for (let i in fileList) {
  646. let response = fileList[i].response;
  647. if (response.errno && response.errno != "0") {
  648. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  649. // 上传失败移除该 file 对象
  650. fileList.splice(i, 1);
  651. } else {
  652. let id = fileList[i].response.data.id;
  653. fileIds.push(id);
  654. }
  655. }
  656. this.dataForm.fileIds = fileIds.join(",");
  657. },
  658. resetForm() {
  659. this.$refs['dataForm'].resetFields();
  660. },
  661. submitForm() {
  662. this.$refs['dataForm'].validate((valid) => {
  663. if (valid) {
  664. certificateUpload(this.dataForm)
  665. .then((response) => {
  666. this.dialogVisible = false;
  667. this.$notify({
  668. title: "成功",
  669. message: "证书上传成功",
  670. type: "success",
  671. duration: 2000,
  672. });
  673. this.dataForm.type = [];
  674. this.dataForm.fileIds = '';
  675. this.dataForm.files = [];
  676. this.listQuery.page = 1;
  677. this.getDataList();
  678. })
  679. .catch(() => { });
  680. } else {
  681. return false;
  682. }
  683. });
  684. },
  685. getDataList() {
  686. certificatePage(this.listQuery).then(response => {
  687. this.dataList = response.data.data.items;
  688. this.total = response.data.data.total;
  689. })
  690. },
  691. handleSizeChange(val) {
  692. this.listQuery.limit = val
  693. this.getDataList()
  694. },
  695. handleCurrentChange(val) {
  696. this.listQuery.page = val
  697. this.getDataList()
  698. },
  699. getTypeListCite() {
  700. dictList({ dictType: 'customer_treward_type' }).then(response => {
  701. this.typeListCite = response.data.data;
  702. })
  703. },
  704. getAllUserList() {
  705. allUserList().then(response => {
  706. this.recipientsList = response.data.data;
  707. }).catch(() => { });
  708. },
  709. handleClick(tab, event) {
  710. console.log(tab.name, event);
  711. },
  712. handleRemoveCite(file, fileList) {
  713. console.log(file, fileList);
  714. let fileIds = [];
  715. for (let i in fileList) {
  716. let id = fileList[i].response.data.id;
  717. fileIds.push(id);
  718. }
  719. this.dataFormCite.fileIds = fileIds.join(",");
  720. },
  721. beforeUploadFileCite(file) {
  722. console.log(file);
  723. const size = file.size / 1024 / 1024;
  724. console.log(size);
  725. if (size > 10) {
  726. this.$message.error("文件大小不能超过10MB!");
  727. return false;
  728. }
  729. },
  730. handleAvatarSuccessCite(res, file, fileList) {
  731. console.log(file, fileList);
  732. console.log("------", "==========");
  733. console.log("res = ", res);
  734. let fileIds = [];
  735. for (let i in fileList) {
  736. let response = fileList[i].response;
  737. if (response.errno && response.errno != "0") {
  738. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  739. // 上传失败移除该 file 对象
  740. fileList.splice(i, 1);
  741. } else {
  742. let id = fileList[i].response.data.id;
  743. fileIds.push(id);
  744. }
  745. }
  746. this.dataFormCite.fileIds = fileIds.join(",");
  747. },
  748. submitFormCite() {
  749. this.$refs['dataFormCite'].validate((valid) => {
  750. if (valid) {
  751. if(this.dialogStatus=='create'){
  752. uploadCite(this.dataFormCite)
  753. .then((response) => {
  754. this.dialogVisibleCite = false;
  755. this.$notify({
  756. title: "成功",
  757. message: "表彰上传成功",
  758. type: "success",
  759. duration: 2000,
  760. });
  761. this.dataFormCite.type = [];
  762. this.dataFormCite.fileIds = '';
  763. this.dataFormCite.files = [];
  764. this.listQueryCite.page = 1;
  765. this.getDataListCite();
  766. })
  767. .catch(() => { });
  768. }
  769. if(this.dialogStatus=='edit'){
  770. editCite(this.dataFormCite)
  771. .then((response) => {
  772. this.dialogVisibleCite = false;
  773. this.$notify({
  774. title: "成功",
  775. message: "表彰修改成功",
  776. type: "success",
  777. duration: 2000,
  778. });
  779. this.dataFormCite.type = [];
  780. this.dataFormCite.fileIds = '';
  781. this.dataFormCite.files = [];
  782. this.listQueryCite.page = 1;
  783. this.getDataListCite();
  784. })
  785. .catch(() => { });
  786. }
  787. } else {
  788. return false;
  789. }
  790. });
  791. },
  792. getDataListCite() {
  793. citeList(this.listQueryCite).then(response => {
  794. this.dataListCite = response.data.data.items;
  795. this.totalCite = response.data.data.total;
  796. })
  797. },
  798. handleSizeChangeCite(val) {
  799. this.listQueryCite.limit = val
  800. this.getDataListCite()
  801. },
  802. handleCurrentChangeCite(val) {
  803. this.listQueryCite.page = val
  804. this.getDataListCite()
  805. },
  806. handleClickTrain(row, tag) {
  807. console.log(row);
  808. },
  809. handleRemoveTrain(file, fileList) {
  810. console.log(file, fileList);
  811. let fileIds = [];
  812. for (let i in fileList) {
  813. let id = fileList[i].response.data.id;
  814. fileIds.push(id);
  815. }
  816. this.dataFormTrain.materials = fileIds.join(",");
  817. },
  818. handleRemoveTrain1(file, fileList) {
  819. console.log(file, fileList);
  820. let fileIds = [];
  821. for (let i in fileList) {
  822. let id = fileList[i].response.data.id;
  823. fileIds.push(id);
  824. }
  825. this.dataFormTrain.signPhotos = fileIds.join(",");
  826. },
  827. handleRemoveTrain2(file, fileList) {
  828. console.log(file, fileList);
  829. let fileIds = [];
  830. for (let i in fileList) {
  831. let id = fileList[i].response.data.id;
  832. fileIds.push(id);
  833. }
  834. this.dataFormTrain.sitePhotos = fileIds.join(",");
  835. },
  836. beforeUploadFileTrain(file) {
  837. console.log(file);
  838. const size = file.size / 1024 / 1024;
  839. console.log(size);
  840. if (size > 10) {
  841. this.$message.error("文件大小不能超过10MB!");
  842. return false;
  843. }
  844. },
  845. handleAvatarSuccessTrain(res, file, fileList) {
  846. console.log(file, fileList);
  847. console.log("------", "==========");
  848. console.log("res = ", res);
  849. let fileIds = [];
  850. for (let i in fileList) {
  851. let response = fileList[i].response;
  852. if (response.errno && response.errno != "0") {
  853. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  854. // 上传失败移除该 file 对象
  855. fileList.splice(i, 1);
  856. } else {
  857. let id = fileList[i].response.data.id;
  858. fileIds.push(id);
  859. }
  860. }
  861. this.dataFormTrain.materials = fileIds.join(",");
  862. },
  863. handleAvatarSuccessTrain1(res, file, fileList) {
  864. console.log(file, fileList);
  865. console.log("------", "==========");
  866. console.log("res = ", res);
  867. let fileIds = [];
  868. for (let i in fileList) {
  869. let response = fileList[i].response;
  870. if (response.errno && response.errno != "0") {
  871. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  872. // 上传失败移除该 file 对象
  873. fileList.splice(i, 1);
  874. } else {
  875. let id = fileList[i].response.data.id;
  876. fileIds.push(id);
  877. }
  878. }
  879. this.dataFormTrain.signPhotos = fileIds.join(",");
  880. },
  881. handleAvatarSuccessTrain2(res, file, fileList) {
  882. console.log(file, fileList);
  883. console.log("------", "==========");
  884. console.log("res = ", res);
  885. let fileIds = [];
  886. for (let i in fileList) {
  887. let response = fileList[i].response;
  888. if (response.errno && response.errno != "0") {
  889. this.$message.error("该文件上传失败,已被移除,请重新上传!");
  890. // 上传失败移除该 file 对象
  891. fileList.splice(i, 1);
  892. } else {
  893. let id = fileList[i].response.data.id;
  894. fileIds.push(id);
  895. }
  896. }
  897. this.dataFormTrain.sitePhotos = fileIds.join(",");
  898. },
  899. submitFormTrain() {
  900. this.$refs['dataFormTrain'].validate((valid) => {
  901. if (valid) {
  902. if(this.dialogStatus=='create'){
  903. uploadTrain(this.dataFormTrain)
  904. .then((response) => {
  905. this.dialogVisibleTrain = false;
  906. this.$notify({
  907. title: "成功",
  908. message: "培训上传成功",
  909. type: "success",
  910. duration: 2000,
  911. });
  912. this.listQueryTrain.page = 1;
  913. this.getDataListTrain();
  914. })
  915. .catch(() => { });
  916. }
  917. if(this.dialogStatus=='edit'){
  918. editTrain(this.dataFormTrain)
  919. .then((response) => {
  920. this.dialogVisibleTrain = false;
  921. this.$notify({
  922. title: "成功",
  923. message: "培训修改成功",
  924. type: "success",
  925. duration: 2000,
  926. });
  927. this.listQueryTrain.page = 1;
  928. this.getDataListTrain();
  929. })
  930. .catch(() => { });
  931. }
  932. } else {
  933. return false;
  934. }
  935. });
  936. },
  937. getDataListTrain() {
  938. trainList(this.listQueryCite).then(response => {
  939. debugger
  940. this.dataListTrain = response.data.data.items;
  941. this.totalTrain = response.data.data.total;
  942. })
  943. },
  944. handleSizeChangeTrain(val) {
  945. this.listQueryTrain.limit = val
  946. this.getDataListTrain()
  947. },
  948. handleCurrentChangeTrain(val) {
  949. this.listQueryTrain.page = val
  950. this.getDataListTrain()
  951. },
  952. },
  953. };
  954. </script>
  955. <style scoped>
  956. .text-overflow {
  957. max-width: 400px;
  958. overflow: hidden;
  959. text-overflow: ellipsis;
  960. display: -webkit-box;
  961. -webkit-box-orient: vertical;
  962. -webkit-line-clamp: 1;
  963. }
  964. .right-wrap {
  965. width: 100%;
  966. }
  967. .myPage {
  968. margin-top: 30px;
  969. display: flex;
  970. justify-content: center;
  971. align-items: center;
  972. }
  973. .gainList_container {
  974. min-height: 560px;
  975. }
  976. .gainList_container .gains_wrapper {
  977. position: relative;
  978. box-sizing: border-box;
  979. padding-top: 20px;
  980. padding-left: 20px;
  981. }
  982. .gainList_container .gains_wrapper .list {
  983. display: flex;
  984. flex-wrap: wrap;
  985. margin: -20px 0 0 -20px;
  986. }
  987. .item.isVirtual {
  988. background: #f7f8fa;
  989. border: 1px solid #e5e6eb;
  990. }
  991. .item {
  992. display: flex;
  993. align-items: center;
  994. flex: 0 1 auto;
  995. width: calc(50% - 30px);
  996. min-width: 410px;
  997. height: 116px;
  998. padding-right: 6px;
  999. background: #fff;
  1000. border: 1px solid #e5e6eb;
  1001. box-sizing: border-box;
  1002. border-radius: 4px;
  1003. margin-right: 20px;
  1004. margin-top: 20px;
  1005. }
  1006. .item .img-wapper {
  1007. width: 114px;
  1008. height: 114px;
  1009. margin-right: 16px;
  1010. background: #f7f8fa;
  1011. display: flex;
  1012. align-items: center;
  1013. justify-content: center;
  1014. }
  1015. .item .img-wapper .item-icon {
  1016. max-width: 72px;
  1017. max-height: 72px;
  1018. }
  1019. .item .main {
  1020. flex: auto;
  1021. }
  1022. .item .date,
  1023. .item .goods_name {
  1024. overflow: hidden;
  1025. text-overflow: ellipsis;
  1026. }
  1027. .item .goods_name {
  1028. display: -webkit-box;
  1029. -webkit-box-orient: vertical;
  1030. -webkit-line-clamp: 1;
  1031. font-size: 16px;
  1032. line-height: 24px;
  1033. color: #252933;
  1034. padding-bottom: 4px;
  1035. }
  1036. .item p {
  1037. margin: 0;
  1038. }
  1039. .item .date {
  1040. white-space: nowrap;
  1041. font-size: 14px;
  1042. line-height: 22px;
  1043. color: #8a919f;
  1044. }
  1045. .item .buttons {
  1046. margin-top: 8px;
  1047. margin-left: -8px;
  1048. display: flex;
  1049. align-items: center;
  1050. }
  1051. .item .button-item.actived {
  1052. background: #f2f3f5;
  1053. color: #8a919f;
  1054. }
  1055. .item .button-item {
  1056. cursor: pointer;
  1057. display: flex;
  1058. align-items: center;
  1059. font-size: 13px;
  1060. padding: 0 8px;
  1061. height: 26px;
  1062. margin-left: 8px;
  1063. font-weight: 500;
  1064. background: #f2f3f5;
  1065. border-radius: 50px;
  1066. color: #8a919f;
  1067. white-space: nowrap;
  1068. border: none;
  1069. }
  1070. .item .arrow {
  1071. width: 12px;
  1072. height: 12px;
  1073. margin-left: 2px;
  1074. transform: rotate(-90deg);
  1075. }
  1076. svg:not(:root) {
  1077. overflow: hidden;
  1078. }
  1079. .item .button-item svg path {
  1080. fill: currentColor;
  1081. }
  1082. .status {
  1083. margin-right: 30px;
  1084. font-size: 13px;
  1085. }
  1086. .status.bottom {
  1087. margin-top: 55px;
  1088. }
  1089. .status .use-btn {
  1090. color: #1e80ff;
  1091. }
  1092. .timeline-container {
  1093. margin: 0 auto;
  1094. }
  1095. .timeline-entry-list {
  1096. margin-right: 17.5rem;
  1097. border-radius: 2px;
  1098. width: 720px;
  1099. position: relative;
  1100. }
  1101. .entry-list-container {
  1102. background-color: #fff;
  1103. border-radius: 4px;
  1104. min-height: 500px;
  1105. }
  1106. .entry-list-container .tab-header {
  1107. display: flex;
  1108. align-items: center;
  1109. justify-content: space-between;
  1110. padding: 20px 20px 16px;
  1111. border-bottom: 1px solid #e5e6eb;
  1112. overflow: hidden;
  1113. }
  1114. .tab-header .tab-title {
  1115. white-space: nowrap;
  1116. font-size: 18px;
  1117. font-weight: 600;
  1118. }
  1119. .content-body {
  1120. padding: 10px 20px 16px;
  1121. }
  1122. .serie {
  1123. margin: 0 0 40px;
  1124. }
  1125. .serie .serie-title {
  1126. height: 32px;
  1127. width: 100%;
  1128. display: flex;
  1129. justify-content: center;
  1130. align-items: center;
  1131. text-align: center;
  1132. margin-bottom: 20px;
  1133. }
  1134. .serie .serie-title .title {
  1135. font-style: normal;
  1136. font-weight: 600;
  1137. font-size: 20px;
  1138. color: #1d2129;
  1139. margin: 0 16px;
  1140. }
  1141. .serie .serie-title .series-left,
  1142. .serie .serie-title .series-right {
  1143. width: 16px;
  1144. height: 2px;
  1145. }
  1146. img {
  1147. border-style: none;
  1148. }
  1149. .serie .badge-icon-list {
  1150. display: grid;
  1151. justify-content: space-between;
  1152. grid-template-columns: repeat(auto-fill, 150px);
  1153. grid-gap: 10px 20px;
  1154. flex-wrap: wrap;
  1155. }
  1156. .serie .badge-icon-list .badge-icon-item {
  1157. -webkit-tap-highlight-color: transparent;
  1158. cursor: pointer;
  1159. width: 150px;
  1160. font-style: normal;
  1161. font-weight: 400;
  1162. display: flex;
  1163. flex-direction: column;
  1164. justify-content: center;
  1165. align-items: center;
  1166. }
  1167. .serie .badge-icon-list .badge-icon-item .badge-item-icon {
  1168. width: 65px;
  1169. height: 65px;
  1170. }
  1171. .serie .badge-icon-list .badge-icon-item .badge-item-icon .not-obtain {
  1172. filter: grayscale(100%);
  1173. }
  1174. .serie .badge-icon-list .badge-icon-item .badge-item-icon img {
  1175. width: 100%;
  1176. height: 100%;
  1177. }
  1178. .serie .badge-icon-list .badge-icon-item .badge-desc {
  1179. /* margin-top: -10px; */
  1180. text-align: center;
  1181. color: #1d2129;
  1182. font-size: 16px;
  1183. line-height: 28px;
  1184. }
  1185. .serie .badge-icon-list .badge-icon-item .obtain-date {
  1186. font-size: 14px;
  1187. text-align: center;
  1188. color: #86909c;
  1189. height: 24px;
  1190. line-height: 24px;
  1191. }
  1192. </style>