remark_detail.html 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>标注中心</title>
  6. <script src="/bower_components/jquery/dist/jquery.min.js"></script>
  7. <link href="/dist/css/normalize.min.css" rel="stylesheet">
  8. <link href="/dist/css/animate.min.css" rel="stylesheet">
  9. <link rel="stylesheet" href="/dist/css/zz.css">
  10. <link rel="stylesheet" href="/dist/css/index.css">
  11. <script src="/dist/js/vue.min.js"></script>
  12. <script src="/dist/js/index.js"></script>
  13. <style>
  14. .add-tip {
  15. width: 24px;
  16. height: 22px;
  17. line-height: 22px;
  18. text-align: center;
  19. color: #fff;
  20. margin: 0;
  21. padding: 0;
  22. border: 1px solid #ccc;
  23. background-color: #fdfdfd;
  24. }
  25. .info-box > * {
  26. cursor: pointer;
  27. }
  28. .button-group {
  29. display: flex;
  30. flex-direction: row;
  31. align-items: center;
  32. justify-content: space-between;
  33. }
  34. .button-group .info-box {
  35. margin-left: -60px;
  36. }
  37. .edit-box .edit.two .edit-title {
  38. padding-right: 4px;
  39. }
  40. .edit-box .edit .edit-input .label > span {
  41. max-width: unset;
  42. text-align: left;
  43. padding: 0 1em;
  44. }
  45. .a-button {
  46. color: #4169e3;
  47. margin: 8px 15px;
  48. padding: 4px 10px;
  49. }
  50. .button-box.delete-box {
  51. margin-right: 22px !important;
  52. margin-left: -419px !important;
  53. }
  54. .button-box.delete-box .pass {
  55. background-color: #f56c6c !important;
  56. }
  57. .pass.success {
  58. background-color: #09bb07 !important;
  59. }
  60. .pass.default {
  61. background-color: #adadad !important;
  62. }
  63. .el-table td, .el-table th {
  64. padding: 4px 0;
  65. }
  66. .top-button-group {
  67. margin-top: 20px;
  68. }
  69. .top-button-group button {
  70. margin-bottom: 12px;
  71. }
  72. .el-radio-button--mini.info .el-radio-button__inner {
  73. color: #909399 !important;
  74. background: #f4f4f5 !important;
  75. border-color: #d3d4d6 !important;
  76. }
  77. .default .el-radio-button__orig-radio + .el-radio-button__inner {
  78. color: #409eff;
  79. background: #ecf5ff;
  80. border-color: #b3d8ff;
  81. }
  82. .success .el-radio-button__orig-radio + .el-radio-button__inner {
  83. color: #67c23a;
  84. background: #f0f9eb;
  85. border-color: #c2e7b0;
  86. }
  87. .success .el-radio-button__orig-radio:checked + .el-radio-button__inner,
  88. .default .el-radio-button__orig-radio:checked + .el-radio-button__inner {
  89. color: #FFF;
  90. background-color: #409EFF;
  91. border-color: #409EFF;
  92. -webkit-box-shadow: -1px 0 0 0 #409EFF;
  93. box-shadow: -1px 0 0 0 #409EFF
  94. }
  95. </style>
  96. <script>
  97. function prettyPrint(obj) {
  98. var ENDLINE = "\n";
  99. var COMMA_ENDLINE = ",\n";
  100. var OBJ_BEGIN = "{";
  101. var OBJ_END = "}";
  102. var ARR_BEGIN = "[";
  103. var ARR_END = "]";
  104. var INDNET_SPACES = 4;
  105. return (function innerPrettyPrint(obj, spaces) {
  106. var type = typeof obj;
  107. if (type == "number" || type == "boolean") {
  108. return obj.toString();
  109. } else if (type == "string") {
  110. if (obj != "" && !isNaN(Number(obj))) {
  111. return Number(obj)
  112. }
  113. return '"' + obj + '"';
  114. } else {
  115. var entries = [];
  116. var thisIndent = ' '.repeat(spaces);
  117. var subIndent = thisIndent + ' '.repeat(INDNET_SPACES);
  118. var subSpaces = spaces + INDNET_SPACES;
  119. if (Object.prototype.toString.call(obj) == '[object Object]') {
  120. for (var k in obj) {
  121. entries.push('"' + k + '": ' + innerPrettyPrint(obj[k], subSpaces));
  122. }
  123. return OBJ_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + OBJ_END;
  124. } else if (Object.prototype.toString.call(obj) == '[object Array]') {
  125. obj.forEach(function (a) {
  126. entries.push(innerPrettyPrint(a, subSpaces));
  127. });
  128. return ARR_BEGIN + ENDLINE + subIndent + entries.join(COMMA_ENDLINE + subIndent) + ENDLINE + thisIndent + ARR_END;
  129. } else if (obj === null) {
  130. return "null";
  131. } else {
  132. return obj.toString();
  133. }
  134. }
  135. })(obj, 0);
  136. }
  137. </script>
  138. </head>
  139. <body>
  140. <main id="app">
  141. <div class="content" :class="{mm:showPop}">
  142. <!--文章区-->
  143. <div class="article">
  144. <div class="top-button-group">
  145. <el-radio-group v-model="activeLabel" size="mini">
  146. <el-radio-button class="default" label="原文"></el-radio-button>
  147. {{if .T.info.filetext}}
  148. <el-radio-button class="default" label="附件"></el-radio-button>
  149. {{end}}
  150. </el-radio-group>
  151. <el-radio-group v-model="activeLabel" v-for="(item, index) in otherInfo" size="mini">
  152. <el-radio-button class="success" :label="item.id">[[item.subtype]]</el-radio-button>
  153. <el-radio-button class="success" :label="item.id + '-附件'">附件</el-radio-button>
  154. </el-radio-group>
  155. <el-radio-group v-if="moreInfo&&moreInfo.length > 0" size="mini">
  156. <el-popover
  157. placement="right-end"
  158. trigger="hover">
  159. <el-table :data="moreInfo" max-height="300">
  160. <el-table-column width="50" property="subtype" label="类型"></el-table-column>
  161. <el-table-column width="180" property="publishtime" label="发布日期"></el-table-column>
  162. <el-table-column width="220" property="title" label="标题">
  163. <template slot-scope="scope">
  164. <a href="#" @click="openLink(scope.row.href)">[[scope.row.title]]</a>
  165. </template>
  166. </el-table-column>
  167. </el-table>
  168. <el-radio-button class="info" slot="reference" style="border-color: #d3d4d6;">更多
  169. </el-radio-button>
  170. </el-popover>
  171. </el-radio-group>
  172. </div>
  173. <hr style="border: 1px;" width="100%">
  174. <br><a v-if="getPageInfo.href.length > 0" :href="getPageInfo.href" target="_blank">查看原文</a>
  175. <!--<a href="{{.T.jyhref}}" target="_blank">剑鱼链接</a>-->
  176. <h3>[[getPageInfo.title]]</h3><br>
  177. <div v-html="pageHtml"></div>
  178. </div>
  179. <!--操作区-->
  180. <div class="operation">
  181. <!--edit-box-->
  182. <div class="edit-box">
  183. <!--edit-->
  184. <div class="edit one" v-for="(one,oindex) in editData" :key="oindex">
  185. <!--one-->
  186. <div class="edit-title" @click="one.show = !one.show">
  187. <span>[[one.title]]</span>
  188. <div class="button-group">
  189. <div v-if="one.showCheck">
  190. <input :id="one.title" v-show="one.title == '标的信息'" @click.stop type="checkbox"
  191. v-model="one.checkAllTag">
  192. <label @click.stop v-show="one.title == '标的信息'" :for="one.title">全部标注</label>
  193. </div>
  194. <!-- &nbsp;
  195. <div v-if="one.showCheck">
  196. <input :id="one.title" @click.stop type="checkbox" v-model="one.checkType">
  197. <label @click.stop :for="one.title">是否抽取</label>
  198. </div>-->
  199. <div class="button-box">
  200. <!--v-show="one.title == '基本字段'"-->
  201. <button class="pass success" @click.stop="saveDataOne(one,'1')"
  202. style="font-size: 14px;width: auto;float:left;">通过
  203. </button>
  204. <button class="pass default" @click.stop="saveDataOne(one,'-1')"
  205. style="font-size: 14px;width: auto;float:left">取消
  206. </button>
  207. <!-- <button class="pass" @click.stop="open(one, true)" style="font-size: 14px;width: auto;float:left">保存</button>-->
  208. </div>
  209. <!--<button class="add" v-show="one.title != '基本'" @click.stop="one.content.push(getTemp(2));goMark2(500)">+</button>-->
  210. <!--<button class="add" v-show="one.title == '基本'" @click.stop="one.content[0].content.push(getTemp(3));goMark2(60)">+</button>-->
  211. <div class="info-box" @click.stop v-show="one.showCheck">
  212. <div :class="{default: one.status == '-1'}" @click="setStatus(one,'-1')"></div>
  213. <!--<div :class="{ok: one.status == '1'}" @click="one.status = '1'"></div>-->
  214. <div :class="{ok: one.status == '1'}" @click="setStatus(one,'1')"></div>
  215. <!--<div :class="{err: one.status == '0'}" @click="one.status = '0'"></div>-->
  216. <div class="add-tip" :class="{err: (one.status != '1' && one.status != '-1')}"
  217. @click="setStatus(one,'2')"></div>
  218. </div>
  219. </div>
  220. </div>
  221. <transition tag="div">
  222. <div>
  223. <div class="button-box" v-if="one.showCheck&&one.show">
  224. <button class="pass a-button" @click.stop="addChild(one, oindex)"
  225. style="font-size: 14px;width: auto;float:left;">新增[[one.title]]
  226. </button>
  227. </div>
  228. <div class="edit-content" :class="{t:one.title == '基本字段'}" v-show="one.show">
  229. <!--two-->
  230. <span v-show="one.content.length === 0">当前您还没有添加子包</span>
  231. <div class="edit two" v-for="(two,index) in one.content" :key="index">
  232. <div class="edit-title" v-if="two.title" @click="two.show = !two.show">
  233. <span>[[two.title]]</span>
  234. <div class="button-box"
  235. :style="one.title == '多包信息' ? 'margin-right: 193px' : ''">
  236. <button v-if="one.title == '多包信息'" class="pass a-button"
  237. @click.stop="addThreeChild(two,'2',one)"
  238. style="font-size: 14px;margin: 0;width: auto;float:left;">新增子包中标信息
  239. </button>
  240. <button class="pass success" @click.stop="saveDataTwo(two,'1',one)"
  241. style="font-size: 14px;width: auto;float:left;">通过
  242. </button>
  243. <button class="pass default" @click.stop="saveDataTwo(two,'-1',one)"
  244. style="font-size: 14px;width: auto;float:left">取消
  245. </button>
  246. </div>
  247. <div class="button-box delete-box">
  248. <button class="pass" @click.stop="delNewTwo(one, index, two)">删除</button>
  249. </div>
  250. </div>
  251. <transition tag="div">
  252. <div class="edit-content" v-show="two.show">
  253. <!--input-->
  254. <div class="edit-input">
  255. <div v-for="(uin, uindex) of two.uInput" class="input-box"
  256. :key="uin.title">
  257. <div class="label" v-if="uin.selectArr">
  258. <span>[[uin.title]]&nbsp;:&nbsp;</span>
  259. <select v-model="uin.select"
  260. @change="focusFn(uin, oindex,index,uindex, two, one)">
  261. <option disabled value="">请选择</option>
  262. <option v-for="o in uin.selectArr">[[o]]</option>
  263. </select>
  264. <div class="info-box">
  265. <div :class="{default: uin.status == '-1'}"
  266. @click="setStatus(uin,'-1', two, one)"></div>
  267. <div :class="{ok: uin.status == '1'}"
  268. @click="setStatus(uin,'1', two, one)"></div>
  269. <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
  270. <div class="add-tip" @click="setStatus(uin,'2', two, one)"
  271. :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
  272. </div>
  273. </div>
  274. <div class="label" v-else :title="uin.input">
  275. <span @click="goText(uin.title)">[[uin.title]]&nbsp;:&nbsp;</span>
  276. <input type="text" v-model="uin.input"
  277. @focus="goText(uin.input)" @click="goText(uin.input)"
  278. @blur="focusFn(uin, oindex, index, uindex,two,one)">
  279. <div class="info-box">
  280. <div :class="{default: uin.status == '-1'}"
  281. @click="setStatus(uin,'-1', two, one)"></div>
  282. <div :class="{ok: uin.status == '1'}"
  283. @click="setStatus(uin,'1', two, one)"></div>
  284. <!--<div :class="{err: uin.status == '0'}" @click="uin.status = '0'"></div>-->
  285. <div class="add-tip" @click="setStatus(uin,'2', two, one)"
  286. :class="{err: (uin.status != '1' && uin.status != '-1')}"></div>
  287. </div>
  288. </div>
  289. </div>
  290. </div>
  291. <!--three-->
  292. <!--<div>
  293. <div class="edit-title" v-show="one.title == '基本字段'">
  294. <span>候选人</span>
  295. <div class="info-box" >
  296. <div :class="{default: two.wstatus == '-1'}" @click="two.wstatus = '-1'"></div>
  297. <div :class="{ok: two.wstatus == '1'}" @click="two.wstatus = '1'"></div>
  298. <el-popover trigger="click" >
  299. <div style="text-align: right; margin: 0">
  300. <el-button type="success" size="mini" @click="two.wstatus = '2'">新增</el-button>
  301. <el-button type="warning" size="mini" @click="two.wstatus = '3'">修改</el-button>
  302. <el-button type="danger" size="mini" @click="two.wstatus = '4'">删除</el-button>
  303. </div>
  304. <div class="add-tip" slot="reference" :class="{err: (two.wstatus != '1' && two.wstatus != '-1')}">[[textMap[two.wstatus] || '']]</div>
  305. </el-popover>
  306. </div>
  307. </div>
  308. <div class="edit three" v-for="(three,index) in two.content" :key="index">
  309. <div class="edit-title" @click="three.show = !three.show">
  310. <span>[[three.title]]</span>
  311. </div>
  312. <div class="edit-content" v-show="three.show">
  313. <div class="edit-input">
  314. <div class="input-box" v-for="(threeUin,index) in three.uInput" :key="threeUin.title">
  315. <div class="label">
  316. <span @click="goText(threeUin.title)">[[threeUin.title]]&nbsp;:&nbsp;</span>
  317. <input type="text" v-model="threeUin.input" @focus="goText(threeUin.input)" @click="goText(threeUin.input)">
  318. <div class="info-box">
  319. <div :class="{default: threeUin.status == '-1'}" @click="threeUin.status = '-1'"></div>
  320. <div :class="{ok: threeUin.status == '1'}" @click="threeUin.status = '1'"></div>
  321. <el-popover trigger="click" >
  322. <div style="text-align: right; margin: 0">
  323. <el-button type="success" size="mini" @click="threeUin.status = '2'">新增</el-button>
  324. <el-button type="warning" size="mini" @click="threeUin.status = '3'">修改</el-button>
  325. <el-button type="danger" size="mini" @click="threeUin.status = '4'">删除</el-button>
  326. </div>
  327. <div class="add-tip" slot="reference" :class="{err: (threeUin.status != '1' && threeUin.status != '-1')}">[[textMap[threeUin.status] || '']]</div>
  328. </el-popover>
  329. </div>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </div>
  335. </div>-->
  336. </div>
  337. </transition>
  338. </div>
  339. </div>
  340. </div>
  341. </transition>
  342. </div>
  343. </div>
  344. <div class="save-box">
  345. <!-- <button class="code" @click.stop="showPop = true" style="width:100px">源码</button>&nbsp;&nbsp; -->
  346. <!-- <button class="code" @click.stop="open(1)" style="width:100px">全部验证</button> -->
  347. <button class="code" @click.stop="open(2)" style="width:100px">字段验证</button>
  348. <!-- <button class="code" @click.stop="open('', false)" style="width:100px">保存</button>&nbsp;&nbsp;-->
  349. <button class="code" @click.stop="openHref" style="width:100px">下一条</button>
  350. <!--<button class="code" @click.stop="window.location.href='/'" style="width:100px">下一条</button>-->
  351. </div>
  352. </div>
  353. </div>
  354. <!--弹出层-->
  355. <dialog class="dialog" v-if="showPop">
  356. <span class="close" @click="showPop = false;changeText()">x</span>
  357. <div class="pop">
  358. <div class="title">源码</div>
  359. <div class="con" ref="text" contentEditable="true">
  360. <pre v-html="addStyle(editData)"></pre>
  361. </div>
  362. <button @click="showPop = false;changeText();upChange()">保&nbsp;存</button>
  363. </div>
  364. </dialog>
  365. <dialog id="com-alert" class="dialog" style="background: rgba(124, 124, 125, 0.1);z-index:9999;display: none;">
  366. <div class="pop" style="background: rgba(124, 124, 125, 0.1);">
  367. <div id="com-alert-val" class="title" style="color:red">保存成功</div>
  368. </div>
  369. </dialog>
  370. </main>
  371. </body>
  372. <script>
  373. var allCheckFields = {{ .T.fields }} //本次需标注的所有字段
  374. var moreInfo = {{ .T.moreInfo }} // 更多关联信息
  375. var otherInfo = {{ .T.otherInfo }} //公告关联信息
  376. let purchasing_status = {{ .T.ck_purchasinglist }} //标的物标记
  377. let purchasing = {{ .T.ck_pclistag }}
  378. let package_status = {{ .T.ck_package }} //包标记
  379. let winneroder_status = {{ .T.ck_winnerorder }} //中标候选人标记
  380. // 页面数据
  381. var pageDataMap = {
  382. '原文': {
  383. title: '{{.T.info.title}}',
  384. href: '{{.T.info.href}}',
  385. // html: '{{Html (Regexp (Regexp .T.info.detail "(\\n|\\\\n)\\s+" "\n") "(`|\\n|\\\\n)+" "<br/>")}}',
  386. html: '{{ .T.info.detail }}',
  387. },
  388. '附件': {
  389. title: '附件内容',
  390. href: '',
  391. // html:{{if .T.info.filetext}}{{.T.info.filetext}}.replace(/(\\n|\\\\n)\\s+/, '\n').replace(/(`|\\n|\\\\n)+/, '<br>'){{else}}``{{end}} }
  392. html: '{{ .T.info.filetext }}',
  393. },
  394. }
  395. //快捷键
  396. $(document).keydown(function (event) {
  397. if (!event.shiftKey) {
  398. var text = getSelectedContents();//获取选中文本
  399. if (!text.trim().length) {
  400. return
  401. }
  402. }
  403. if (event.keyCode === 82) {//项目名称快捷键r
  404. if (event.shiftKey) {
  405. app.changeBaseValue(0, '', 2) //删除对应文本
  406. } else {
  407. app.changeBaseValue(0, text, 2)//填充
  408. }
  409. } else if (event.keyCode === 81) {//省份快捷键q
  410. if (event.shiftKey) {
  411. app.changeBaseValue(1, '', 2) //删除对应文本
  412. } else {
  413. app.changeBaseValue(1, text, 2)//填充
  414. }
  415. } else if (event.keyCode === 84) {//项目编号快捷键t
  416. if (event.shiftKey) {
  417. app.changeBaseValue(2, '', 2) //删除对应文本
  418. } else {
  419. app.changeBaseValue(2, text, 2)//填充
  420. }
  421. } else if (event.keyCode === 87) {//城市快捷键w
  422. if (event.shiftKey) {
  423. app.changeBaseValue(3, '', 2) //删除对应文本
  424. } else {
  425. app.changeBaseValue(3, text, 2)//填充
  426. }
  427. } else if (event.keyCode === 69) {//区县快捷键e
  428. if (event.shiftKey) {
  429. app.changeBaseValue(5, '', 2) //删除对应文本
  430. } else {
  431. app.changeBaseValue(5, text, 2)//填充
  432. }
  433. } else if (event.keyCode === 65) {//预算快捷键a
  434. if (event.shiftKey) {
  435. app.changeBaseValue(6, '', 2) //删除对应文本
  436. } else {
  437. app.changeBaseValue(6, text, 2)//填充
  438. }
  439. } else if (event.keyCode === 90) {//中标金额快捷键z
  440. if (event.shiftKey) {
  441. app.changeBaseValue(7, '', 2) //删除对应文本
  442. } else {
  443. app.changeBaseValue(7, text, 2)//填充
  444. }
  445. } else if (event.keyCode === 83) {//采购单位快捷键s
  446. if (event.shiftKey) {
  447. app.changeBaseValue(8, '', 2) //删除对应文本
  448. } else {
  449. app.changeBaseValue(8, text, 2)//填充
  450. }
  451. } else if (event.keyCode === 88) {//代理机构快捷键x
  452. if (event.shiftKey) {
  453. app.changeBaseValue(9, '', 2) //删除对应文本
  454. } else {
  455. app.changeBaseValue(9, text, 2)//填充
  456. }
  457. } else if (event.keyCode === 68) {//中标单位快捷键d
  458. if (event.shiftKey) {
  459. app.changeBaseValue(10, '', 2) //删除对应文本
  460. } else {
  461. app.changeBaseValue(10, text, 2)//填充
  462. }
  463. }
  464. });
  465. //获取鼠标选中的文本
  466. function getSelectedContents() {
  467. var text = "";
  468. if (window.getSelection) { //chrome,firefox,opera
  469. var range = window.getSelection().getRangeAt(0);
  470. var container = document.createElement('div');
  471. container.appendChild(range.cloneContents());
  472. text = container.innerHTML;
  473. //return container.innerHTML;
  474. //return window.getSelection(); //只复制文本
  475. } else if (document.getSelection) { //其他
  476. var range = document.getSelection().getRangeAt(0);
  477. var container = document.createElement('div');
  478. container.appendChild(range.cloneContents());
  479. text = container.innerHTML;
  480. //return container.innerHTML;
  481. //return document.getSelection(); //只复制文本
  482. } else if (document.selection) { //IE特有的
  483. text = document.selection.createRange().htmlText;
  484. //return document.selection.createRange().htmlText;
  485. //return document.selection.createRange().text; //只复制文本
  486. }
  487. text = text.replace(/(\r|\n|\s+|&nbsp;|<[^>]*>|<\/[^>]*)/g, "")
  488. return text;
  489. }
  490. //记录是否点击保存
  491. var issave = false;
  492. var _id = {{ .T.info._id }}
  493. var nextid = {{ .T.nextid }}
  494. //基本信息
  495. var common = {{ .T.common }}
  496. console.log(common)
  497. var uInput = [];
  498. for (k in common) {
  499. var tmp = {}
  500. tmp.title = common[k].descript
  501. tmp.input = common[k].value
  502. tmp.key = common[k].key
  503. if (common[k].key === "subtype") {
  504. tmp.select = common[k].value
  505. tmp.selectArr = {{ .T.topsubtype }}
  506. }
  507. if (common[k].key === "attach_discern") {
  508. tmp.select = common[k].value
  509. tmp.selectArr = ['识别有效', '识别无效']
  510. }
  511. if (common[k].key === "attach_ext") {
  512. tmp.select = common[k].value
  513. tmp.selectArr = ['抽取正确', '抽取错误']
  514. }
  515. if (common[k].key === "isrepeat") {
  516. tmp.select = common[k].value
  517. tmp.selectArr = ['是', '否']
  518. }
  519. tmp.status = common[k].status
  520. if (common[k].key === "bidamounttype") {
  521. tmp.select = common[k].value ? common[k].value : '金额'
  522. tmp.selectArr = ['金额', '折扣率', '单价']
  523. tmp.status = 1
  524. }
  525. uInput[k] = tmp
  526. }
  527. //时间地点
  528. var timeplace = {{ .T.timeplace }}
  529. var tpInput = [];
  530. for (k in timeplace) {
  531. var tmp = {}
  532. tmp.title = timeplace[k].descript
  533. tmp.input = timeplace[k].value
  534. tmp.key = timeplace[k].key
  535. tmp.status = timeplace[k].status
  536. tpInput[k] = tmp
  537. }
  538. //其他信息
  539. var other = {{ .T.other }}
  540. var otherInput = [];
  541. for (k in other) {
  542. var tmp = {}
  543. tmp.title = other[k].descript
  544. tmp.input = other[k].value
  545. tmp.key = other[k].key
  546. tmp.status = other[k].status
  547. if (other[k].key === "isppp" || other[k].key === "contract_guarantee" || other[k].key === "bid_guarantee") {
  548. tmp.select = other[k].value
  549. tmp.selectArr = ['是', '否']
  550. }
  551. otherInput[k] = tmp
  552. }
  553. //中标候选人
  554. var c_worder = {{ .T.worder }}
  555. var worder_new = {{ .T.worder_new }}
  556. var c_content = [];
  557. for (k in c_worder) {
  558. var c_uInput = [];
  559. for (i in c_worder[k]) {
  560. var tmp = {}
  561. tmp.title = c_worder[k][i].descript
  562. tmp.input = c_worder[k][i].value || ''
  563. tmp.key = c_worder[k][i].key
  564. tmp.status = c_worder[k][i].status
  565. c_uInput[i] = tmp
  566. }
  567. var content = {};
  568. content.title = "候选人"
  569. content.show = true
  570. content.status = worder_new[k]["status"]
  571. content.uInput = c_uInput
  572. content.ck_isnew = worder_new[k]["isnew"] || false
  573. content.content = []
  574. c_content[k] = content
  575. }
  576. //标的信息
  577. var purchasinglist = {{ .T.purchasinglist }}
  578. var pcl_new = {{ .T.pcl_new }}
  579. var pcl_content = [];
  580. for (k in purchasinglist) {
  581. var c_uInput = [];
  582. for (i in purchasinglist[k]) {
  583. var tmp = {}
  584. tmp.title = purchasinglist[k][i].descript
  585. tmp.input = purchasinglist[k][i].value
  586. tmp.key = purchasinglist[k][i].key
  587. tmp.status = purchasinglist[k][i].status
  588. //if(purchasinglist[k][i].key== "pclisover"){
  589. // tmp.select = purchasinglist[k][i].value ? purchasinglist[k][i].value : '是'
  590. // //tmp.select=purchasinglist[k][i].value
  591. // tmp.selectArr=['是','否']
  592. //}
  593. c_uInput[i] = tmp
  594. }
  595. var content = {};
  596. content.title = "标的物"
  597. content.show = true
  598. content.status = pcl_new[k]["status"]
  599. content.uInput = c_uInput
  600. content.ck_isnew = pcl_new[k]["isnew"] || false
  601. content.content = []
  602. pcl_content[k] = content
  603. }
  604. //var ispackage='{{.T.ispackage}}'
  605. //子包信息
  606. var packs = {{ .T.packs }}
  607. var packskey = {{ .T.packskey }}
  608. var pkg_new = {{ .T.pkg_new }}
  609. //分包抽查,若果有分包,默认ok
  610. //if(packs.length>0&&ispackage=="1"){
  611. // ck_package="1"
  612. //}
  613. var p_content = [];
  614. for (k in packs) {
  615. //子包基本信息
  616. var uInputs = [];
  617. var pack = packs[k]["pack"]
  618. for (i in pack) {
  619. var tmp = {}
  620. tmp.title = pack[i].descript
  621. tmp.input = pack[i].value
  622. tmp.key = pack[i].key
  623. tmp.status = pack[i].status
  624. if (pack[i].key === "bidamounttype") {
  625. tmp.select = pack[i].value ? pack[i].value : '金额'
  626. tmp.selectArr = ['金额', '折扣率', '单价']
  627. tmp.status = 1
  628. }
  629. uInputs[i] = tmp
  630. }
  631. //中标人信息
  632. var winnerall = packs[k]["winnerall"]
  633. for (i in winnerall) {
  634. var tmp = {}
  635. tmp.title = winnerall[i].descript
  636. tmp.input = winnerall[i].value
  637. tmp.key = winnerall[i].key
  638. tmp.status = winnerall[i].status
  639. uInputs.push(tmp)
  640. }
  641. var content = {};
  642. content.title = "子包";
  643. content.show = true;
  644. content.status = packs[k]["packstatus"];
  645. content.uInput = uInputs;
  646. content.ck_isnew = pkg_new[k] || false
  647. content.num = packskey[k];
  648. p_content[k] = content;
  649. }
  650. var pclf = {{ .T.PurchasinglistField }}
  651. var pclfInput = []
  652. for (i in pclf) {
  653. for (key in pclf[i]) {
  654. var tempNode = {
  655. input: "",
  656. key: key,
  657. status: "2",
  658. title: pclf[i][key]
  659. }
  660. //if(key== "pclisover"){
  661. // tempNode.select= '是'
  662. // tempNode.selectArr=['是','否']
  663. //}
  664. pclfInput.push(tempNode)
  665. }
  666. }
  667. var wodf = {{ .T.WinnerorderField }}
  668. var wodfInput = []
  669. for (i in wodf) {
  670. for (key in wodf[i]) {
  671. wodfInput.push({
  672. input: "",
  673. key: key,
  674. status: "2",
  675. title: wodf[i][key]
  676. })
  677. }
  678. }
  679. var pf = {{ .T.PackageField }}
  680. var pfInput = []
  681. for (i in pf) {
  682. for (key in pf[i]) {
  683. var tempNode = {
  684. input: "",
  685. key: key,
  686. status: "2",
  687. title: pf[i][key]
  688. }
  689. if (key === "bidamounttype") {
  690. tempNode.select = '金额'
  691. tempNode.selectArr = ['金额', '折扣率', '单价']
  692. }
  693. pfInput.push(tempNode)
  694. }
  695. }
  696. var app = new Vue({
  697. el: '#app',
  698. delimiters: ["[[", "]]"],
  699. data: {
  700. activeLabel: '原文',
  701. nowLabel: ['原文'],
  702. otherInfo: otherInfo,
  703. moreInfo: moreInfo,
  704. scrollCache: {
  705. value: '',
  706. index: 0
  707. },
  708. textMap: ['', '', '增', '改', '删'],
  709. // pageHtml: `{{Html (Regexp (Regexp .T.info.detail "(\\n|\\\\n)\\s+" "\n") "(`|\\n|\\\\n)+" "<br/>")}}`,
  710. pageHtml: '{{ .T.info.detail }}',
  711. showPop: false,
  712. editData:[{
  713. title: '基本字段',
  714. show: true,
  715. status: "1",
  716. content: [{
  717. title: '',
  718. show: true,
  719. delete: false,
  720. //wstatus:"-1",
  721. uInput: uInput
  722. //content: c_content
  723. }]
  724. }, {
  725. title: '时间地点',
  726. show: false,
  727. status: "1",
  728. content: [{
  729. title: '',
  730. show: true,
  731. delete: false,
  732. //wstatus:"-1",
  733. uInput: tpInput
  734. }]
  735. }, {
  736. title: '标的信息',
  737. show: false,
  738. showCheck: true,
  739. key: 'purchasinglist',
  740. //checkType: {{.T.ck_pclisext}},
  741. checkAllTag: {{ .T.ck_pclistag }},
  742. status: purchasing_status,
  743. content: pcl_content
  744. }, {
  745. title: '多包信息',
  746. show:false,
  747. showCheck: true,
  748. key: 'package',
  749. // checkType: {{.T.ck_pkgisext}},
  750. status: package_status,
  751. content: p_content
  752. }, {
  753. title: '中标候选人信息',
  754. show: false,
  755. showCheck: true,
  756. key: 'winnerorder',
  757. // checkType: {{.T.ck_wodrisext}},
  758. status: winneroder_status,
  759. content: c_content
  760. }, {
  761. title: '其余信息',
  762. show:false,
  763. status:"1",
  764. content:[{
  765. title: '',
  766. show: true,
  767. delete: false,
  768. //wstatus:"-1",
  769. uInput: otherInput
  770. }]
  771. }],
  772. originData: []},
  773. watch: {
  774. //切换标签时更改正文内容
  775. 'activeLabel':
  776. function () {
  777. this.pageHtml = this.getPageInfo.html
  778. }},
  779. computed: {
  780. getPageInfo() {
  781. var tempData = {
  782. title: '',
  783. html: this.pageHtml,
  784. href: ''
  785. }
  786. //匹配原文或者原文附件
  787. var originData = pageDataMap[this.activeLabel]
  788. if (originData) {
  789. tempData.title = originData.title
  790. tempData.html = originData.html
  791. tempData.href = originData.href
  792. } else {//匹配原公告关联信息
  793. var tempS = this.activeLabel.split('-')
  794. var isFile = tempS.length === 2
  795. var otherData = this.otherInfo.filter(v => v.id == tempS[0])
  796. if (otherData.length > 0) {
  797. tempData.title = otherData[0].title
  798. tempData.html = otherData[0].detail
  799. tempData.href = otherData[0].href
  800. if (isFile) {
  801. tempData.title = '附件内容'
  802. tempData.html = otherData[0].filetext
  803. tempData.href = ''
  804. }
  805. }
  806. }
  807. return tempData
  808. }
  809. },
  810. mounted() {
  811. // 缓存原始数据
  812. this.originData = JSON.parse(JSON.stringify([].concat(this.editData)))
  813. },
  814. methods: {
  815. // 当前输入框数据与原始数据比较
  816. focusFn(uin, oIndex, tIndex, uIndex, two, one) {
  817. if (uin.key === "bidendtime" || uin.key === "bidopentime" || uin.key === "project_startdate" || uin.key === "project_completedate" ||
  818. uin.key === "publishtime" || uin.key === "signaturedate") {
  819. var val = uin.input
  820. if (val !== "") {
  821. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  822. var regExp = new RegExp(reg);
  823. if (!regExp.test(val)) {
  824. this.$message({
  825. message: uin.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  826. type: 'warning',
  827. duration: 2000,
  828. offset: 300
  829. });
  830. return
  831. }
  832. }
  833. }
  834. var newNode = this.originData[oIndex].content[tIndex]
  835. if (newNode == null) {//新增子模块处理
  836. return
  837. }
  838. var oNode = newNode.uInput[uIndex]
  839. if (oNode == null) {//新增中标人信息处理
  840. return
  841. }
  842. var changeStatus = uin.input === oNode.input//多包中新增的中标信息报错
  843. if (uin.select) {
  844. changeStatus = uin.select === oNode.select
  845. }
  846. uin.status = changeStatus ? 1 : 2
  847. this.setStatus(uin, uin.status, two, one);
  848. },
  849. openLink(link) {
  850. window.open(link, '_blank')
  851. },
  852. // 改变基本字段属性
  853. changeBaseValue(index, input, status) {
  854. if (this.editData[0].content[0].uInput[index].input !== input) {
  855. this.editData[0].content[0].uInput[index].input = input
  856. this.editData[0].content[0].uInput[index].status = status
  857. }
  858. },
  859. selectChange(uni, status, two, one) {
  860. //状态更新
  861. if (uni.status === '-1' || uni.status === '2') {
  862. status = 2
  863. }
  864. this.setStatus(uni, status, two, one)
  865. },
  866. openHref() {
  867. if (!issave) {
  868. alert("请先保存数据!")
  869. } else {
  870. if (nextid === "") {
  871. showMsg("数据已经全部标注完")
  872. } else {
  873. window.location.href = "/front/user/remark/detail?pid=" + {{ .T.pid }} + "&did=" + nextid + "&s_sourceinfo=" + {{ .T.s_sourceinfo }}
  874. }
  875. }
  876. },
  877. // 检查一级是否需要改变状态
  878. checkOneStatus: function (config) {
  879. var tempObj = {
  880. obj: config.type ? config.one : config.two
  881. }
  882. if (config.type) {
  883. tempObj.list = config.one.content
  884. } else {
  885. tempObj.list = config.two.uInput
  886. }
  887. var statusList = [0, 0, 0, 0, 0]
  888. for (var i in tempObj.list) {
  889. var tempList = tempObj.list[i]
  890. var tempIndex = Number(tempList.status)
  891. if (tempIndex === -1) {
  892. tempIndex = 0
  893. }
  894. statusList[tempIndex] = Number(statusList[tempIndex]) + 1
  895. }
  896. if (statusList[1] > 0) {
  897. tempObj.obj.status = 1
  898. }
  899. if (statusList[4] > 0 || statusList[3] > 0 || statusList[2] > 0) {
  900. tempObj.obj.status = 2
  901. }
  902. if (statusList[4] === tempObj.list.length) {
  903. tempObj.obj.status = 4
  904. if (tempObj.obj.title === "标的信息" || tempObj.obj.title === "多包信息" || tempObj.obj.title === "中标候选人信息") {
  905. tempObj.obj.status = 2
  906. }
  907. }
  908. if (statusList[3] === tempObj.list.length) {
  909. tempObj.obj.status = 2
  910. }
  911. if (statusList[2] === tempObj.list.length) {
  912. tempObj.obj.status = 2
  913. }
  914. if (statusList[0] === tempObj.list.length) {
  915. tempObj.obj.status = -1
  916. }
  917. if (!config.type) {
  918. this.checkOneStatus({
  919. one: config.one,
  920. two: config.two,
  921. type: true
  922. })
  923. }
  924. },
  925. //切换状态按钮
  926. setStatus:function (witch, s, two, one) {
  927. var key = witch.key
  928. //校验日期格式
  929. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  930. key === "publishtime" || key === "signaturedate") {
  931. var val = witch.input
  932. if (val !== "") {
  933. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  934. var regExp = new RegExp(reg);
  935. if (!regExp.test(val)) {
  936. this.$message({
  937. message: witch.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  938. type: 'warning',
  939. duration: 2000,
  940. offset: 300
  941. });
  942. //alert(witch.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  943. return
  944. }
  945. }
  946. }
  947. if (s === '2' && !one && !two && witch.content.length === 0) {
  948. return
  949. }
  950. witch.status = s;
  951. if (two) {
  952. this.checkOneStatus({
  953. one: one,
  954. two: two,
  955. type: false
  956. })
  957. }
  958. },
  959. //二级删除
  960. delNewTwo: function (one, index, two) {
  961. //two.ck_isnew = false //目前点删除按钮页面直接不显示,但是集合索引位置不变,所以加了此代码
  962. //two.show = false
  963. if (two.ck_isnew) {
  964. one.content.splice(index, 1)
  965. } else {
  966. two.show = false
  967. two.status = 4
  968. this.saveDataTwo(two, 4, one)
  969. }
  970. this.checkOneStatus({
  971. one: one,
  972. two: two,
  973. type: true
  974. })
  975. },
  976. /*add style*/
  977. addStyle: function (data) {
  978. return prettyPrint(data).replace(/(checkAllTag|checkType|showCheck|wstatus|status|key|title|input|content|uInput|selectArr|select|show|true)/g, "<mark>$1</mark>")
  979. },
  980. /*同步修改源码*/
  981. changeText: function (boolean) {
  982. try {
  983. var tempText = JSON.parse(this.$refs.text.innerText.replace(/(\n|\s)/g, ''))
  984. if (boolean) {
  985. this.tagvalues = tempText
  986. } else {
  987. this.editData = tempText
  988. }
  989. } catch (err) {
  990. alert('源码修改失败')
  991. }
  992. },
  993. goText: function (value) {
  994. /*重置Html*/
  995. this.pageHtml = this.getPageInfo.html
  996. if (!value) {
  997. return false
  998. }
  999. var rs = new RegExp('(' + value + ')', 'gi')
  1000. //选中input框值文本高亮
  1001. if (rs.test(this.pageHtml)) {
  1002. this.pageHtml = this.pageHtml.replace(rs, '<mark>$1</mark>')
  1003. /*延迟查询dom,防止dom未插入*/
  1004. var $this = this
  1005. setTimeout(function () {
  1006. $this.goMark(value)
  1007. }, 150)
  1008. } else {
  1009. /*重置Html*/
  1010. this.pageHtml = this.getPageInfo.html
  1011. }
  1012. },
  1013. goMark: function (value) {
  1014. var mLength = document.querySelectorAll('mark').length
  1015. if (this.scrollCache.value === value) {
  1016. this.scrollCache.index = (this.scrollCache.index + 1) % mLength
  1017. } else {
  1018. this.scrollCache.index = 0
  1019. }
  1020. this.scrollCache.value = value
  1021. /*滚动到第一个mark*/
  1022. var temp = document.querySelectorAll('mark')[this.scrollCache.index]
  1023. $("mark").removeClass('focus')
  1024. $(temp).addClass('focus')
  1025. document.querySelector('.article').scrollTop = offset(temp).top - window.screen.height / 2
  1026. },
  1027. // markTag:function(n){
  1028. // $.ajax({
  1029. // url:"/markTag",
  1030. // method:"post",
  1031. // data: {tag:n,_id:_id},
  1032. // success:function(res){
  1033. // if(res){
  1034. // document.getElementById("com-alert-val").innerHtml="标记成功";
  1035. // var label1 = document.getElementById("com-alert");
  1036. // label1.style.display="block";
  1037. // setTimeout(function(){label1.style.display="none";},1000)
  1038. // }
  1039. // }
  1040. // });
  1041. // },
  1042. addChild: function (one, oindex) {
  1043. var tempNode = {}
  1044. switch (one.title) {
  1045. case "标的信息": {
  1046. tempNode = {
  1047. //content: [],
  1048. show: true,
  1049. ck_isnew: true,
  1050. status: 2,
  1051. title: "标的物",
  1052. uInput: JSON.parse(JSON.stringify(pclfInput))
  1053. }
  1054. break
  1055. }
  1056. case "多包信息": {
  1057. tempNode = {
  1058. //content: [],
  1059. show: true,
  1060. status: 2,
  1061. ck_isnew: true,
  1062. title: "子包",
  1063. uInput: JSON.parse(JSON.stringify(pfInput))
  1064. }
  1065. break
  1066. }
  1067. case "中标候选人信息": {
  1068. tempNode = {
  1069. //content: [],
  1070. show: true,
  1071. status: 2,
  1072. ck_isnew: true,
  1073. title: "候选人",
  1074. uInput: JSON.parse(JSON.stringify(wodfInput))
  1075. }
  1076. break
  1077. }
  1078. }
  1079. // if (one.status >= 2) {
  1080. // one.status = '2'
  1081. // }
  1082. one.content.push(tempNode)
  1083. this.checkOneStatus({
  1084. one: one,
  1085. type: true
  1086. })
  1087. this.$nextTick(() => {
  1088. var tempN = $(".edit.one").eq(oindex).find(".edit-title")
  1089. var goTop = tempN.eq(tempN.length - 1).offset().top
  1090. setTimeout(() => {
  1091. $(".operation").scrollTop($(".operation").scrollTop() + goTop)
  1092. }, 150)
  1093. })
  1094. },
  1095. // 新增子包中标信息字段
  1096. addThreeChild:function (two, n, one) {
  1097. two.uInput.push({
  1098. input: "",
  1099. key: 'winner',
  1100. status: "2",
  1101. title: '标段(包)中标单位'
  1102. })
  1103. two.uInput.push({
  1104. input: "",
  1105. key: 'bidamount',
  1106. status: "2",
  1107. title: '标段(包)中标金额'
  1108. })
  1109. two.status = 2
  1110. this.checkOneStatus({
  1111. one: one,
  1112. two: two,
  1113. type: false
  1114. })
  1115. },
  1116. //保存
  1117. saveDataTwo:function (two, n, one) {
  1118. two.uInput.forEach(function (v) {
  1119. var key = v.key
  1120. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  1121. key === "publishtime" || key === "signaturedate") {
  1122. var val = v.input
  1123. if (val !== "") {
  1124. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  1125. var regExp = new RegExp(reg);
  1126. if (!regExp.test(val)) {
  1127. this.$message({
  1128. message: v.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  1129. type: 'warning',
  1130. duration: 2000,
  1131. offset: 300
  1132. });
  1133. //alert(v.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  1134. return
  1135. }
  1136. }
  1137. }
  1138. if (n === "1" && v.status === "-1") {
  1139. v.status = n
  1140. } else if (n === "-1") {
  1141. v.status = n
  1142. } else if (n === "2") {
  1143. v.status = n
  1144. } else if (n === "4") {
  1145. v.status = n
  1146. }
  1147. });
  1148. two.status = n
  1149. this.checkOneStatus({
  1150. one: one,
  1151. two: two,
  1152. type: false
  1153. })
  1154. /**
  1155. two.content.forEach(function(v) {
  1156. v.uInput.forEach(function(value) {
  1157. if (value.input && value.input != '') {
  1158. value.status = n
  1159. }
  1160. })
  1161. })
  1162. */
  1163. },
  1164. saveDataOne:function (one, n) {
  1165. //保存后的样式
  1166. var _this = this
  1167. one.content.forEach(function (v) {
  1168. v.uInput.forEach(function (value) {
  1169. var key = value.key
  1170. if (n === 1) {
  1171. if (key === "bidendtime" || key === "bidopentime" || key === "project_startdate" || key === "project_completedate" ||
  1172. key === "publishtime" || key === "signaturedate") {
  1173. var val = value.input
  1174. if (val !== "") {
  1175. var reg = /^[1-9]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\s+(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d$/;
  1176. var regExp = new RegExp(reg);
  1177. if (!regExp.test(val)) {
  1178. this.$message({
  1179. message: value.title + ",日期格式错误!正确格式:2006-01-02 15:04:05",
  1180. type: 'warning',
  1181. duration: 2000,
  1182. offset: 300
  1183. });
  1184. //alert(value.title+",日期格式错误!正确格式:2006-01-02 15:04:05")
  1185. return
  1186. }
  1187. }
  1188. }
  1189. }
  1190. // 取消全部,通过时判断状态是否处于修改新增等
  1191. if (n === "1" && value.status === "-1") {
  1192. value.status = n
  1193. } else if (n === "-1") {
  1194. value.status = n
  1195. }
  1196. })
  1197. _this.checkOneStatus({
  1198. two: v,
  1199. one: one,
  1200. type: false
  1201. })
  1202. });
  1203. },
  1204. //验证保存提示
  1205. open:function (stype) {
  1206. this.$confirm('是否保存?', '提示', {
  1207. confirmButtonText: '确定',
  1208. cancelButtonText: '取消',
  1209. type: 'warning'
  1210. }).then(() => {
  1211. this.upChange(stype)
  1212. }).catch(() => {
  1213. });
  1214. },
  1215. //保存事件
  1216. upChange: function (stype) {
  1217. console.log(this.editData)
  1218. var noTagKey = [];
  1219. console.log(allCheckFields)
  1220. this.editData.filter(function (one) {
  1221. if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
  1222. if (allCheckFields[one.key] && one.status === -1) {
  1223. noTagKey.push(one.title);
  1224. }
  1225. } else {
  1226. one.content.filter(function (v) {
  1227. v.uInput.filter(function (u) {
  1228. if (allCheckFields[u.key] && u.status === -1) {
  1229. noTagKey.push(u.title);
  1230. }
  1231. })
  1232. })
  1233. }
  1234. })
  1235. if (noTagKey.length > 0) {
  1236. var fieldText = noTagKey.join(",");
  1237. fieldText = fieldText.replace(/\([^\)]*\)/g, "");
  1238. this.$alert("未标注字段:" + fieldText);
  1239. return
  1240. }
  1241. var resultStatus = false
  1242. if (stype === 1) {//全部字段验证
  1243. var checkAllKey = this.editData.filter(function (one) {
  1244. var otherOne = one.content.filter(function (v) {
  1245. return v.uInput.filter(function (u) {
  1246. return u.status === '-1'
  1247. }).length
  1248. })
  1249. if ((one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") && (one.status === "-1")) {
  1250. return true
  1251. } else {
  1252. return otherOne.length
  1253. }
  1254. })
  1255. resultStatus = !Boolean(checkAllKey.length)
  1256. } else {//部分字段验证
  1257. var otherTag = 0 //标注状态 0:没标 1:标注成功 2:标注失败
  1258. var baseTag = 0
  1259. this.editData.filter(function (one) {
  1260. //多包信息、中标候选人信息在为标注失败的前提下检测标注状态,一个失败不能保存
  1261. if (otherTag < 2) {
  1262. if (one.title === "标的信息" || one.title === "多包信息" || one.title === "中标候选人信息") {
  1263. if (one.status === "-1") {//没标
  1264. if (otherTag !== 1) {//前一个标注成功不用记录后一个是否未标
  1265. otherTag = 0
  1266. }
  1267. } else {
  1268. if (one.content.length === 0) {//不含子包
  1269. if (one.status === '2') {
  1270. otherTag = 2 //失败
  1271. } else {
  1272. otherTag = 1 //成功
  1273. }
  1274. } else {//含子包
  1275. if (one.title === "标的信息") {
  1276. var otherOne = one.content.filter(function (v) {
  1277. if (v.status >= 1) {//子信息标注
  1278. var twoLength = v.uInput.filter(function (u) {
  1279. return u.status === '-1'
  1280. })
  1281. if (twoLength.length > 0) {
  1282. otherTag = 2
  1283. }
  1284. return true //返回此条信息被标注
  1285. }
  1286. })
  1287. if (otherTag !== 2) {
  1288. if (otherOne.length > 0) {//
  1289. otherTag = 1
  1290. } else {
  1291. otherTag = 2
  1292. }
  1293. }
  1294. } else {
  1295. var otherOne = one.content.filter(function (v) {
  1296. return v.uInput.filter(function (u) {
  1297. return u.status === '-1'
  1298. }).length
  1299. })
  1300. if (otherOne.length > 0) {//
  1301. otherTag = 2
  1302. } else {
  1303. otherTag = 1
  1304. }
  1305. }
  1306. }
  1307. }
  1308. } else {
  1309. var baseOne = one.content.filter(function (v) {
  1310. return v.uInput.filter(function (u) {
  1311. return u.status !== '-1'
  1312. }).length
  1313. })
  1314. if (baseOne.length > 0) {//基本字段
  1315. baseTag = 1
  1316. }
  1317. }
  1318. }
  1319. })
  1320. if (otherTag === 0 && baseTag === 1) {
  1321. resultStatus = true
  1322. } else if (otherTag === 1) {
  1323. resultStatus = true
  1324. }
  1325. }
  1326. if (!resultStatus) {
  1327. this.$alert("未标注完成");
  1328. return
  1329. }
  1330. var d = JSON.stringify(this.editData);
  1331. console.log(d)
  1332. var _this = this
  1333. $.ajax({
  1334. url: "/front/data/mark",
  1335. method: "post",
  1336. data: {key: d, _id: _id, stype: stype},
  1337. success: function (res) {
  1338. if (res) {
  1339. _this.$message({
  1340. message: '保存成功',
  1341. type: 'success',
  1342. duration: 1000,
  1343. offset: 300
  1344. });
  1345. issave = true//保存成功
  1346. }
  1347. },
  1348. error: function (err) {
  1349. alert(err);
  1350. }
  1351. });
  1352. },
  1353. //保存提示
  1354. // open:function(one, type) {
  1355. // this.$confirm('是否保存?', '提示', {
  1356. // confirmButtonText: '确定',
  1357. // cancelButtonText: '取消',
  1358. // type: 'warning'
  1359. // }).then(() => {
  1360. // if (type) {
  1361. // this.saveOneData(one)
  1362. // } else {
  1363. // this.upChange()
  1364. // }
  1365. // }).catch(() => {
  1366. // });
  1367. // },
  1368. //一级保存
  1369. // saveOneData: function (one) {
  1370. // if (one.title==="标的信息"||one.title==="多包信息"||one.title==="中标候选人信息"){
  1371. // if(one.status === "-1"){
  1372. // this.$alert(one.title+" 未标注完成")
  1373. // return
  1374. // }else if (one.status !=="-1"){
  1375. // var isAlert = one.content.filter(function(v) {
  1376. // return v.uInput.filter(function (u) {
  1377. // return u.status === '-1'
  1378. // }).length
  1379. // })
  1380. // if (isAlert.length) {
  1381. // this.$alert(one.title+" 未标注完成")
  1382. // return
  1383. // }
  1384. // }
  1385. // }
  1386. // onetext = "["+ JSON.stringify(one) +"]";
  1387. // $.ajax({
  1388. // url:"/center/biaozhu",
  1389. // method:"post",
  1390. // data: {key:onetext,_id:_id},
  1391. // success:function(res){
  1392. // if(res){
  1393. // document.getElementById("com-alert-val").innerHtml="保存成功";
  1394. // var label1 = document.getElementById("com-alert");
  1395. // label1.style.display="block";
  1396. // setTimeout(function(){
  1397. // label1.style.display="none";
  1398. // },
  1399. // 1000)
  1400. // }
  1401. // },
  1402. // error:function(err){
  1403. // alert(err);
  1404. // }
  1405. // });
  1406. // },
  1407. }
  1408. })
  1409. function offset(elem) {
  1410. if (!elem) elem = this;
  1411. var x = elem.offsetLeft;
  1412. var y = elem.offsetTop;
  1413. while (elem === elem.offsetParent) {
  1414. x += elem.offsetLeft;
  1415. y += elem.offsetTop;
  1416. }
  1417. return {left: x, top: y};
  1418. }
  1419. </script>
  1420. </html>