fork_channel.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <?php
  2. /*
  3. *拷贝其他人的逐词解析数据
  4. *输入参数
  5. *src_channel
  6. *dest_channel
  7. *bookid
  8. *paragraph
  9. */
  10. require_once '../studio/index_head.php';
  11. ?>
  12. <body id="file_list_body" >
  13. <?php
  14. require_once __DIR__."/../config.php";
  15. require_once __DIR__."/../public/_pdo.php";
  16. require_once __DIR__."/../public/function.php";
  17. require_once __DIR__."/../channal/function.php";
  18. require_once __DIR__."/../redis/function.php";
  19. require_once __DIR__."/../public/snowflakeid.php";
  20. $snowflake = new SnowFlakeId();
  21. $redis = redis_connect();
  22. require_once '../studio/index_tool_bar.php';
  23. echo '<div class="index_inner" style=" margin-left: 18em;margin-top: 5em;">';
  24. if ($_COOKIE["uid"]) {
  25. $uid = $_COOKIE["uid"];
  26. } else {
  27. echo "尚未登录";
  28. echo "<h3><a href='../ucenter/index.php?op=login'>登录</a>后才可以打开文档 </h3>";
  29. exit;
  30. }
  31. if(isset($_GET["para"])){
  32. $_para = json_decode($_GET["para"]);
  33. }
  34. else{
  35. echo "没有 para 编号";
  36. exit;
  37. }
  38. if (isset($_GET["src_channel"]) == false) {
  39. echo "没有 channel 编号";
  40. exit;
  41. }
  42. //文档信息
  43. $mbook = $_GET["book"];
  44. $paragraph = implode(",",$_para);
  45. if (isset($_GET["dest_channel"]) == false) {
  46. echo '<div class="file_list_block">';
  47. echo "<h2>选择一个空白的版风存储新的文档</h2>";
  48. echo "<div>原有版本中相同段落的数据将被覆盖</div>";
  49. echo "<form action='fork_channel.php' method='get'>";
  50. echo "<input type='hidden' name='book' value='{$_GET["book"]}' />";
  51. echo "<input type='hidden' name='para' value='{$_GET["para"]}' />";
  52. echo "<input type='hidden' name='src_channel' value='{$_GET["src_channel"]}' />";
  53. PDO_Connect(_FILE_DB_CHANNAL_,_DB_USERNAME_,_DB_PASSWORD_);
  54. $query = "SELECT uid,name,lang,status,create_time from "._TABLE_CHANNEL_." where owner_uid = '{$_COOKIE["user_uid"]}' limit 100";
  55. $Fetch = PDO_FetchAll($query);
  56. $i = 0;
  57. PDO_Connect( _FILE_DB_USER_WBW_,_DB_USERNAME_,_DB_PASSWORD_);
  58. foreach ($Fetch as $row) {
  59. echo '<div class="file_list_row" style="padding:5px;display:flex;">';
  60. echo '<div class="pd-10" style="max-width:2em;flex:1;">';
  61. echo '<input name="dest_channel" value="' . $row["uid"] . '" ';
  62. if ($i == 0) {
  63. echo "checked";
  64. }
  65. echo ' type="radio" />';
  66. echo '</div>';
  67. echo '<div class="title" style="flex:3;padding-bottom:5px;">' . $row["name"] . '</div>';
  68. echo '<div class="title" style="flex:3;padding-bottom:5px;">' . $row["lang"] . '</div>';
  69. echo '<div class="title" style="flex:2;padding-bottom:5px;">';
  70. $query = "SELECT count(*) from "._TABLE_USER_WBW_BLOCK_." where channel_uid = '{$row["uid"]}' and book_id = '{$mbook}' and paragraph in ({$paragraph}) limit 100";
  71. $FetchWBW = PDO_FetchOne($query);
  72. echo '</div>';
  73. echo '<div class="title" style="flex:2;padding-bottom:5px;">';
  74. if ($FetchWBW == 0) {
  75. echo $_local->gui->blank;
  76. } else {
  77. echo $FetchWBW . $_local->gui->para;
  78. echo "<a href='../studio/editor.php?op=openchannal&book={$mbook}&para={$paragraph}&channal={$row["uid"]}'>open</a>";
  79. }
  80. echo '</div>';
  81. echo '<div class="summary" style="flex:1;padding-bottom:5px;">' . $row["status"] . '</div>';
  82. echo '<div class="author" style="flex:1;padding-bottom:5px;">' . $row["create_time"] . '</div>';
  83. echo '</div>';
  84. $i++;
  85. }
  86. echo "<input type='submit' />";
  87. echo "</form>";
  88. echo "</div>";
  89. exit;
  90. }
  91. PDO_Connect( _FILE_DB_USER_WBW_,_DB_USERNAME_,_DB_PASSWORD_);
  92. $channelInfo= new Channal($redis);
  93. $srcPower = (int)$channelInfo->getPower($_GET["src_channel"]);
  94. {
  95. if ($srcPower == 30) {
  96. //自己的文档
  97. echo "这是自己的文档,不能复刻。";
  98. } else {
  99. //别人的文档
  100. {
  101. //以前没打开过
  102. echo "<h3>共享的文档,正在fork...</h3>";
  103. echo "<div style='display:none;'>";
  104. //复制数据
  105. //打开逐词解析数据库
  106. $dns = _FILE_DB_USER_WBW_;
  107. $dbhWBW = new PDO($dns,_DB_USERNAME_,_DB_PASSWORD_, array(PDO::ATTR_PERSISTENT => true));
  108. $dbhWBW->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  109. //逐词解析新数据数组
  110. $arrNewBlock = array();
  111. $arrNewBlockData = array();
  112. $arrBlockTransform = array();
  113. $blocks = $_para;
  114. for ($i = 0; $i < count($blocks); $i++) {
  115. #查找是否有旧的wbw_block数据
  116. $query = "SELECT id,uid from "._TABLE_USER_WBW_BLOCK_." where book_id= ? and paragraph = ? and channel_uid = ? ";
  117. $stmt = $dbhWBW->prepare($query);
  118. $stmt->execute(array($_GET["book"],$blocks[$i],$_GET["dest_channel"]));
  119. $fDest = $stmt->fetch(PDO::FETCH_ASSOC);
  120. if($fDest){
  121. #旧的逐词解析数据块wbw_block id
  122. $destUid = $fDest["uid"];
  123. $destId = $fDest["id"];
  124. }
  125. #复制源wbw_block
  126. $iPara = $blocks[$i];
  127. $query = "SELECT uid,book_id,paragraph,style,lang,status from "._TABLE_USER_WBW_BLOCK_." where book_id= ? and paragraph = ? and channel_uid = ? ";
  128. $stmt = $dbhWBW->prepare($query);
  129. $stmt->execute(array($_GET["book"],$iPara,$_GET["src_channel"]));
  130. $fSrcBlock = $stmt->fetch(PDO::FETCH_ASSOC);
  131. if(isset($destId)){
  132. #有旧的wbw_block uuid 使用旧的uuid
  133. $newBlockId = $destId;
  134. $newBlockUid = $destUid;
  135. }
  136. else{
  137. $newBlockId = $snowflake->id();
  138. $newBlockUid = UUID::V4();
  139. }
  140. if ($fSrcBlock) {
  141. $arrBlockTransform[$fSrcBlock["uid"]] = $newBlockId;
  142. array_push($arrNewBlock,
  143. array(
  144. $newBlockId,
  145. $newBlockUid,
  146. "",
  147. $_GET["dest_channel"],
  148. $_GET["src_channel"],
  149. $_COOKIE["user_uid"],
  150. $_COOKIE["user_id"],
  151. $fSrcBlock["book_id"],
  152. $fSrcBlock["paragraph"],
  153. $fSrcBlock["style"],
  154. $fSrcBlock["lang"],
  155. $fSrcBlock["status"],
  156. mTime(),
  157. mTime()
  158. ));
  159. }
  160. #复制源数据
  161. $query = "SELECT block_uid, book_id,paragraph,wid,word,data,status from "._TABLE_USER_WBW_." where block_uid= ? ";
  162. $stmtWBW = $dbhWBW->prepare($query);
  163. $stmtWBW->execute(array($fSrcBlock["uid"]));
  164. $fBlockData = $stmtWBW->fetchAll(PDO::FETCH_ASSOC);
  165. foreach ($fBlockData as $value) {
  166. array_push($arrNewBlockData,
  167. array(
  168. $snowflake->id(),
  169. UUID::V4(),
  170. $newBlockUid,
  171. $newBlockId,
  172. $value["book_id"],
  173. $value["paragraph"],
  174. $value["wid"],
  175. $value["word"],
  176. $value["data"],
  177. mTime(),
  178. mTime(),
  179. $value["status"],
  180. $_COOKIE["user_uid"],
  181. $_COOKIE["user_id"],
  182. ));
  183. }
  184. }
  185. # 查找目标block是否存在
  186. //删除旧的逐词解析block数据块
  187. $query = "DELETE from "._TABLE_USER_WBW_BLOCK_." where paragraph = ? AND book_id = ? AND channel_uid = ? ";
  188. $stmt = $dbhWBW->prepare($query);
  189. $stmt->execute(array($iPara,$_GET["book"],$_GET["dest_channel"]));
  190. //新增逐词解析block数据块
  191. if (count($arrNewBlock) > 0) {
  192. $dbhWBW->beginTransaction();
  193. $query = "INSERT INTO "._TABLE_USER_WBW_BLOCK_."
  194. (
  195. id,
  196. uid ,
  197. parent_id ,
  198. channel_uid ,
  199. parent_channel_uid ,
  200. creator_uid ,
  201. editor_id ,
  202. book_id ,
  203. paragraph ,
  204. style ,
  205. lang ,
  206. status ,
  207. modify_time ,
  208. create_time
  209. ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  210. $stmtNewBlock = $dbhWBW->prepare($query);
  211. foreach ($arrNewBlock as $oneParam) {
  212. $stmtNewBlock->execute($oneParam);
  213. }
  214. // 提交更改
  215. $dbhWBW->commit();
  216. if (!$stmtNewBlock || ($stmtNewBlock && $stmtNewBlock->errorCode() != 0)) {
  217. $error = $dbhWBW->errorInfo();
  218. echo "error - $error[2] <br>";
  219. exit;
  220. } else {
  221. //逐词解析block块复刻成功
  222. $count = count($arrNewBlock);
  223. echo "wbw block $count recorders.<br/>";
  224. }
  225. }
  226. //删除旧的wbw逐词解析数据块
  227. if(isset($destId)){
  228. $query = "DELETE from "._TABLE_USER_WBW_." where block_uid = ? ";
  229. $stmt = $dbhWBW->prepare($query);
  230. $stmt->execute(array($destId));
  231. }
  232. if (count($arrNewBlockData) > 0) {
  233. // 开始一个事务,逐词解析数据 关闭自动提交
  234. $dbhWBW->beginTransaction();
  235. $query = "INSERT INTO "._TABLE_USER_WBW_."
  236. (
  237. id,
  238. uid ,
  239. block_uid ,
  240. block_id ,
  241. book_id ,
  242. paragraph ,
  243. wid ,
  244. word ,
  245. data ,
  246. modify_time ,
  247. create_time ,
  248. status ,
  249. creator_uid,
  250. editor_id
  251. ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  252. $stmtWbwData = $dbhWBW->prepare($query);
  253. foreach ($arrNewBlockData as $oneParam) {
  254. $stmtWbwData->execute($oneParam);
  255. }
  256. // 提交更改
  257. $dbhWBW->commit();
  258. if (!$stmtWbwData || ($stmtWbwData && $stmtWbwData->errorCode() != 0)) {
  259. $error = $dbhWBW->errorInfo();
  260. echo "error - $error[2] <br>";
  261. exit;
  262. } else {
  263. //逐词解析 数据 复刻成功
  264. $count = count($arrNewBlockData);
  265. echo "new wbw $count recorders.";
  266. }
  267. }
  268. //成功
  269. echo "doc list updata 1 recorders.";
  270. echo "</div>";
  271. echo "<h3>复刻成功</h3>";
  272. echo "正在<a href='../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$_GET["dest_channel"]}'>打开</a>文档";
  273. echo "<script>";
  274. echo "window.location.assign(\"../studio/editor.php?op=openchannal&book={$_GET["book"]}&para={$_para[0]}&channal={$_GET["dest_channel"]}\");";
  275. echo "</script>";
  276. }
  277. }
  278. }
  279. echo "</div>";
  280. ?>
  281. </body>
  282. </html>