dataset.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. const express = require('express')
  2. const router = express.Router()
  3. const utils = require('../../utils/index.js')
  4. const pools = require('../../utils/pools.js')
  5. const xlsx = require('node-xlsx')
  6. const fs = require('fs')
  7. const path = require('path')
  8. const fileEvent = require('../../utils/file')
  9. const execTransection = require('../../utils/dbHelper.js')
  10. const datetimeToTime = require('../../utils/tool.js')
  11. const uuid = require('uuid')
  12. // 增加数据集
  13. router.post('/addDataset', async (req, res) => {
  14. let sql = 'INSERT INTO dataset_t(`name`,creator_id) VALUES (?,?)',
  15. obj = req.body
  16. await utils.existName({
  17. sql: 'SELECT name FROM dataset_t WHERE name=?',
  18. name: obj.name,
  19. res,
  20. msg: '该数据集名称已存在!',
  21. req
  22. })
  23. await pools({
  24. sql,
  25. val: [obj.name, obj.creatorId],
  26. run: false,
  27. res,
  28. req
  29. })
  30. })
  31. //查询
  32. router.post('/getDatasetList', async (req, res) => {
  33. let user = await utils.getUserInfo({ req, res }),
  34. obj = req.body
  35. let sql = `SELECT
  36. d.id,
  37. d.name,
  38. d.creator_id AS creatorId,
  39. u.name as creatorName,
  40. (SELECT count(*) from mark_data_t m where m.dataset_id = d.id AND m.state=1) as marked,
  41. (SELECT count(*) from mark_data_t m where m.dataset_id = d.id) as totalNumber
  42. FROM
  43. dataset_t d JOIN user u ON d.creator_id = u.id WHERE 1=1` // WHERE 1=1是一个始终为真的条件,后续动态添加查询条件的起点 JOIN mark_data_t m ON d.id = m.dataset_id
  44. sql = utils.setLike(sql, 'd.name', obj.name) // 添加一个基于name字段的模糊匹配条件,匹配的值来自obj.name
  45. sql = utils.setMoreId(sql, user)
  46. let { total } = await utils.getSum({ sql, name: 'dataset_t d', res, req }) // 执行SQL查询并获取结果中的总数
  47. sql = utils.pageSize(sql, obj.page, obj.size) // 函数来修改SQL语句,添加分页功能。它使用obj.page和obj.size来确定返回结果的范围。
  48. let { result } = await pools({ sql, res, req })
  49. res.send(utils.returnData({ data: result, total }))
  50. })
  51. // 编辑
  52. router.post('/updataDataset', async (req, res) => {
  53. let sql = 'UPDATE dataset_t SET name=? WHERE id=?',
  54. obj = req.body
  55. await pools({ sql, val: [obj.name, obj.id], run: false, res, req })
  56. })
  57. //删除
  58. router.post('/delDataset', async (req, res) => {
  59. obj = req.body
  60. let placeholders = obj.map(() => '?').join(',')
  61. let sql = `DELETE FROM dataset_t WHERE id in (${placeholders})`
  62. await pools({ sql, val: obj, run: false, res, req }) // 注意这里直接传递obj数组作为参数
  63. })
  64. // 查询导入记录
  65. router.post('/getImportRecord', async (req, res) => {
  66. let user = await utils.getUserInfo({ req, res })
  67. obj = req.body
  68. let sql = `SELECT
  69. f.id,
  70. f.name,
  71. (SELECT name from user u where f.importer_id = u.id) as importerName,
  72. f.time,
  73. f.data_volume
  74. FROM
  75. file_import_t f WHERE f.dataset_id = ?`
  76. sql = utils.setLike(sql, 'name', obj.name)
  77. sql = utils.setMoreId(sql, user)
  78. let { total } = await utils.getSumWhere({ sql: '', val: [obj.dataset_id], name: 'file_import_t f', res, req })
  79. sql = utils.pageSize(sql, obj.page, obj.size)
  80. let { result } = await pools({ sql, val: [obj.dataset_id], req })
  81. res.send(utils.returnData({ data: result, total }))
  82. })
  83. // 查询数据集数据
  84. router.post('/getDataList', async (req, res) => {
  85. let user = await utils.getUserInfo({ req, res })
  86. obj = req.body
  87. let sql = `SELECT * FROM mark_data_t WHERE dataset_id=?`
  88. sql = utils.setLike(sql, 'text', obj.text)
  89. sql = utils.setMoreId(sql, user)
  90. let { total } = await utils.getSumWhere({ sql, val: [obj.dataset_id], name: 'mark_data_t', res, req })
  91. sql = utils.pageSize(sql, obj.page, obj.size)
  92. let { result } = await pools({ sql, val: [obj.dataset_id], req })
  93. res.send(utils.returnData({ data: result, total }))
  94. })
  95. // 查看单条数据
  96. router.post('/getData', async (req, res) => {
  97. let user = await utils.getUserInfo({ req, res })
  98. obj = req.body
  99. let sql = `SELECT * FROM mark_data_t WHERE dataset_id=? AND id=?`
  100. sql = utils.setMoreId(sql, user)
  101. let { result } = await pools({ sql, val: [obj.dataset_id, obj.id], req })
  102. res.send(utils.returnData({ data: result }))
  103. })
  104. // 导入数据
  105. router.post('/importData', async (req, res) => {
  106. let fileArr = await fileEvent(req, res)
  107. let filename = fileArr[0].filename
  108. const fileType = req.files[0].mimetype
  109. let list
  110. let uploadAddress = 'D:/dataMark/uploadFile'
  111. //配置获取文件路径
  112. if (fileType.includes('text')) {
  113. const path = `D:/dataMark/uploadFile/${filename}`
  114. fs.readFile(path, 'utf-8', (err, data) => {
  115. if (err) {
  116. res.send(utils.returnData({ code: -1, msg: '文件解析失败' }))
  117. }
  118. const data1 = data.split(/\r?\n/)
  119. list = data1.map((line) => [line])
  120. writeToDatabase(fileArr, list, req, res)
  121. })
  122. } else {
  123. // let xlsxRes = xlsx.parse(`${path.join(__dirname, '../../', 'public/uploadFile/')}${filename}`, { cellDates: true })
  124. let xlsxRes = xlsx.parse(`${uploadAddress}/${filename}`, { cellDates: true })
  125. list = xlsxRes[0].data
  126. list.splice(0, 1)
  127. writeToDatabase(fileArr, list, req, res)
  128. }
  129. })
  130. // 写入数据库
  131. const writeToDatabase = (fileArr, list, req, res) => {
  132. let sqlParamsEntity = []
  133. let fileImportSql = 'INSERT INTO file_import_t(`id`,`name`,`importer_id`,`time`,`data_volume`,`dataset_id`) VALUES (?,?,?,?,?,?)'
  134. let params = JSON.parse(fileArr[0].params.listType)
  135. const uniqueId = uuid.v4()
  136. let name = fileArr[0].originalname
  137. let { importer_id: importerId, dataset_id: datasetId } = params
  138. let currentTime = datetimeToTime()
  139. let dataVolume = list.length
  140. var fileImportParam = [uniqueId, name, importerId, currentTime, dataVolume, datasetId]
  141. sqlParamsEntity.push({
  142. sql: fileImportSql,
  143. values: fileImportParam
  144. })
  145. let markDataSql = 'INSERT INTO mark_data_t(text,`file_id`,`dataset_id`,is_mark,state) VALUES (?,?,?,?,?)'
  146. for (let i = 0; i < list.length; i++) {
  147. let item = list[i]
  148. var markDataParams = [item[0], uniqueId, datasetId, true, false]
  149. sqlParamsEntity.push({
  150. sql: markDataSql,
  151. values: markDataParams
  152. })
  153. }
  154. execTransection(sqlParamsEntity)
  155. .then((resp) => {
  156. res.send(utils.returnData({ code: 1, msg: '导入成功', data: [] }))
  157. })
  158. .catch((err) => {
  159. res.send(utils.returnData({ code: -1, msg: '导入失败', err, req }))
  160. })
  161. }
  162. // 修改text数据
  163. router.post('/updataData', async (req, res) => {
  164. let sql = 'UPDATE mark_data_t SET text=? WHERE id=?',
  165. obj = req.body
  166. await pools({ sql, val: [obj.text, obj.id], run: false, res, req })
  167. })
  168. //删除
  169. router.post('/delData', async (req, res) => {
  170. let sqlParams = []
  171. obj = req.body
  172. let placeholders = obj.map(() => '?').join(',')
  173. let sql = `DELETE FROM mark_data_t WHERE id in (${placeholders})`
  174. // console.log('obj', obj, obj.length)
  175. // let sqlUpdata = `UPDATE file_import_t SET data_volume = data_volume - ${obj.length} WHERE dataset_id=?`
  176. sqlParams.push(
  177. {
  178. sql: sql,
  179. values: obj
  180. },
  181. {
  182. sql: sqlUpdata,
  183. values: []
  184. }
  185. )
  186. execTransection(sqlParams)
  187. .then((resp) => {
  188. res.send(utils.returnData({ code: 1, msg: '删除成功', data: [] }))
  189. })
  190. .catch((err) => {
  191. res.send(utils.returnData({ code: -1, msg, err, req }))
  192. })
  193. // await pools({ sql, val: obj, run: false, res, req }) // 注意这里直接传递obj数组作为参数
  194. })
  195. // 上一条、下一条数据
  196. router.post('/PNData', async (req, res) => {
  197. let user = await utils.getUserInfo({ req, res })
  198. obj = req.body
  199. let sql = ``
  200. if (obj.type === 'previous') {
  201. sql = ` SELECT * FROM mark_data_t m WHERE m.id < ? AND m.dataset_id=? ORDER BY m.id DESC LIMIT 0,1;`
  202. } else {
  203. sql = ` SELECT * FROM mark_data_t m WHERE m.id > ? AND m.dataset_id=? ORDER BY m.id LIMIT 0,1;`
  204. }
  205. sql = utils.setLike(sql, 'text', obj.text)
  206. sql = utils.setMoreId(sql, user)
  207. let { result } = await pools({ sql, val: [obj.id, obj.dataset_id], req })
  208. if (result.length === 0 && obj.type === 'previous') {
  209. res.send(utils.returnData({ data: result, code: 2, msg: '已第一条数据' }))
  210. } else if (result.length === 0 && obj.type === 'next') {
  211. res.send(utils.returnData({ data: result, code: 2, msg: '已是最后一条数据' }))
  212. } else {
  213. res.send(utils.returnData({ data: result }))
  214. }
  215. })
  216. //导出数据
  217. router.post('/exportDataset', async (req, res) => {
  218. let user = await utils.getUserInfo({ req, res }),
  219. obj = req.body
  220. let sql = `SELECT id,text,markInfo FROM mark_data_t m WHERE m.dataset_id=?`
  221. sql += ` ORDER BY id ASC`
  222. let { result } = await pools({ sql, val: [obj.dataset_id], res, req })
  223. // 查询数据集名称
  224. let datasetSql = `SELECT name FROM dataset_t d WHERE d.id=?`
  225. let { datasetName } = await pools({ sql: datasetSql, val: [obj.dataset_id], res, req })
  226. let data = [['id', '文本', '标注信息']]
  227. result.map((t) => {
  228. data.push(Object.values(t))
  229. })
  230. let buffer = xlsx.build([{ name: 'sheet1', data }])
  231. const filename = `标注数据.xlsx`
  232. const encodedFilename = encodeURI(filename)
  233. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;filename=' + encodedFilename)
  234. res.send(buffer)
  235. })
  236. //下载模板
  237. router.post('/downloadTemplate', async (req, res) => {
  238. let data = [['文本']]
  239. let buffer = xlsx.build([{ name: 'sheet1', data }])
  240. const filename = '标注数据模板.xlsx'
  241. const encodedFilename = encodeURI(filename)
  242. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;filename=' + encodedFilename)
  243. res.send(buffer)
  244. })
  245. module.exports = router