service.js

/** @class Service 公文编辑器服务。
 * @summary 处理公文编辑器与后端服务器的交互。需要重载实现五个方法:getData、saveData、listHistory、getHistory、saveHistory,用于公文编辑器与后端服务交互
 * @example
 * import DocEditor from '@o2oa/doceditor';
 * const service = new DocEditor.Service();
 * service.listHistory = function(docid){
 *     //实现获取历史痕迹列表,返回一个数组列表
 * };
 * service.getHistory = function(id){
 *     //实现获取历史痕迹数据
 * };
 * service.saveHistory = function(data){
 *     //实现保存历史痕迹数据
 * };
 * service.getData = function(docid){
 *     //实现获取编辑器数据
 * };
 * service.listHistory = function(data){
 *     //实现保存编辑器数据
 * };
 * service.listHandwritingLog = function(docid){
 *     //返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
 * }
 * service.getHandwritingImage = function(imageId, stauts){
 *     //根据图片id获取图片地址或者是图片base64编码后的数据
 *     //stauts为数字,获取图片的类型,1表示正在编辑的手写签批图片,2表示签批历史记录里不带正文背景的图片,3表示历史记录里带正文背景的图片
 * }
 * service.getEditedHandwriting = function(options){
 *     //实现获取当前处理人编辑的手写数据
 * }
 * service.saveHandwriting = function(data){
 *     //保存手写签批数据
 * }
 * service.submitHandwritingWithDoc = function(data){
 *     //带正文背景提交手写签批
 * }
 * service.submitHandwritingWithoutDoc = function(data){
 *     //不带正文背景提交手写签批
 * }
 * service.htmlToImage = function(data){
 *     //html转图片, 获取图片地址
 * }
 *
 * const editor = DocEditor.createEditor("#div", options, service);
 * editor.load().then(()=>{
 *     //做一些其他的事情,比如绑定事件
 * });
 *
 * @example
 * import DocEditor from '@o2oa/doceditor';
 * class MyService extends DocEditor.Service {
 *     async listHistory(id) {
 *         //实现获取历史痕迹列表,返回一个数组列表
 *     }
 *     async getHistory(id){
 *         //实现获取历史痕迹数据
 *     }
 *     async saveHistory(data){
 *         //实现保存历史痕迹数据
 *     }
 *     async getData(id){
 *         //实现获取编辑器数据
 *     }
 *     async saveData(data){
 *         //实现保存编辑器数据
 *     }
 *     async listHandwritingLog(docid){
 *          //返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
 *     }
 *     async getHandwritingImage(imageId){
 *          //根据图片id获取图片地址或者是图片base64编码后的数据
 *     }
 *     async getEditedHandwriting(options){
 *          //实现获取当前处理人编辑的手写数据
 *     }
 *     async saveHandwriting(data){
 *         //保存手写签批数据
 *      }
 *     async submitHandwritingWithDoc(data){
 *         //带正文背景提交手写签批
 *     }
 *     async submitHandwritingWithoutDoc(data){
 *         //不带正文背景提交手写签批
 *     }
 *     async htmlToImage(data){
 *         //html转图片, 获取图片地址
 *     }
 * };
 *
 * const service = new MyService()
 * const editor = DocEditor.createEditor("#div", options, service);
 * editor.load().then(()=>{
 *     //做一些其他的事情,比如绑定事件
 * });
 */


class Service{
    /**
     * @summary 实现获取历史痕迹列表,返回一个数组列表
     * @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
     * @return {Promise<Array>} 返回一个Promise resolve一个存储了痕迹列表的对象数组
     * @example
     * service.listHistory = function(id){
     *     //实现获取历史痕迹列表,返回一个数组列表,格式如下:
     *     return Promise.resolve([
     *          {
     *            "id": "f2c17bf6-8d00-4204-97ed-00cc843a01cb",         //痕迹内容唯一标识,用于获取具体的痕迹数据,由服务器生成
     *            "person": "huqi@huqi@P",                              //痕迹修订的用户
     *            "category": "documenteditor",                         //编辑id号,由创建编辑器时的options中id字段提供
     *            "activityName": "拟稿",                                //产生痕迹的步骤
     *            "createTime": "2022-03-14 10:16:05",                  //保存时由服务器自动生成
     *            "updateTime": "2022-03-14 10:16:05"                   //保存时由服务器自动生成
     *            ...                                                   //其他数据由创建编辑器时的options中的processInfo对象提供
     *          }
     *    ]);
     * };
     */
    async listHistory(id) {
        // try {
        //     // const tmp = new URL(DocEditor.base||"", location);
        //     // const url = new URL('public/test/documentversion/list.json', tmp);
        //     const url = URL.resolve(this.base, 'public/test/documentversion/list.json');
        //
        //     const res = await whatwgFetch(url);
        //     const json = await res.json();
        //     return json.data;
        // }catch(err){
        //     console.error(err);
        // }
        return null
    }

    /**
     * @summary 实现获取历史痕迹数据
     * @param {String} id 历史痕迹的唯一标识,listHistory方法返回列表中的id
     * @return {Promise<Object>} 返回一个Promise resolve一个存储了痕迹数据的对象
     * @example
     * service.listHistory = function(id){
     *     //实现获取历史痕迹列表,返回一个数组列表,格式如下:
     *     return Promise.resolve({
     *          "id": "1746f647-910f-419e-a55a-d07c176a3f87",           //痕迹内容唯一标识,用于获取具体的痕迹数据,由服务器生成
     *          "person": "胡起",                                         //痕迹修订的用户 创建编辑器时的options中的user.name
     *          "category": "documenteditor",                            //编辑id号,由创建编辑器时的options中id字段提供
     *          "data": "...",                                          //修订痕迹数据,保存时的data
     *          "json": {}                                              //将data中的文本转换为json对象(JSON.parse)
     *          "activityName": "拟稿",                                   //产生痕迹的步骤 创建编辑器时的options中的activity.name
     *          "createTime": "2022-03-12 17:23:40",                    //保存时由服务器自动生成
     *          "updateTime": "2022-03-12 17:23:40"                     //保存时由服务器自动生成
     *    });
     * };
     */
    async getHistory(id){
        // try {
        //     // const tmp = new URL(DocEditor.base||"", location);
        //     // const url = new URL(`public/test/documentversion/${id}.json`, tmp);
        //     const url = URL.resolve(this.base, `public/test/documentversion/${id}.json`);
        //     const res = await whatwgFetch(url);
        //     const json = await res.json();
        //     const patchs = JSON.parse(json.data.data);
        //     json.data.json = patchs;
        //     return json.data;
        // }catch(err){
        //     console.error(err);
        // }
        return null;
    }

    /**
     * @summary 保存历史痕迹
     * @example
     * service.saveHistory = function(data){
     *     //data为要保存的数据,格式如下:
     *     {
     *          "docId": "aaaaa"                 //当前文档的唯一标识,创建编辑器时的options中的docId
     *          "category": "documenteditor",   //编辑id号,由创建编辑器时的options中id字段提供
     *          "data": "...",                  //修订痕迹数据
     *          "person": "测试",                //修订用户 创建编辑器时的options中的user.name
     *          "activityName": "核稿"            //修订时的活动状态 创建编辑器时的options中的activity.name
     *           ...                            //其他数据由创建编辑器时的options中的processInfo对象提供
     *      }
     * };
     */
    async saveHistory(data){
        return null;
    }

    /**
     * @summary 获取编辑器数据
     * @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
     * @return {Promise<Object>} 返回一个Promise resolve一个编辑器数据对象
     * @example
     * service.getData = function(data){
     *     return Promise.resolve({
                "copies": "",
                "secret": "",
                "priority": "",
                "redHeader": "文件红头",
                "fileno": "[文号]",
                "signerTitle": "签发人:",
                "signer": "[签发人]",
                "subject": "[文件标题]",
                "mainSend": "[主送单位:]",
                "filetext": "[请在此处编辑正文内容]",
                "attachmentTitle": "附件:",
                "attachment": "",
                "issuanceUnit": "[发文机关]",
                "issuanceDate": "[成文日期]",
                "annotation": "",
                "copytoTitle": "抄送:",
                "copyto": "[抄送]",
                "copyto2Title": "发:",
                "copyto2": "[发]",
                "editionUnit": "[印发机关]",
                "editionDate": "[印发日期]",
                "meetingAttendTitle": "出席:",
                "meetingLeaveTitle": "请假:",
                "meetingSitTitle": "列席:",
                "meetingAttend": "",
                "meetingLeave": "",
                "meetingSit": "",
                "meetingRecord": ""
            });
     * };
     */

    async getData(id, callback){
        // const data = {
        //     "copies": "",
        //     "secret": "",
        //     "priority": "",
        //     "redHeader": "文件红头",
        //     "fileno": "[文号]",
        //     "signerTitle": "签发人:",
        //     "signer": "[签发人]",
        //     "subject": "[文件标题]",
        //     "mainSend": "[主送单位:]",
        //     "filetext": "[请在此处编辑正文内容]",
        //     "attachmentTitle": "附件:",
        //     "attachment": "",
        //     "issuanceUnit": "[发文机关]",
        //     "issuanceDate": "[成文日期]",
        //     "annotation": "",
        //     "copytoTitle": "抄送:",
        //     "copyto": "[抄送]",
        //     "copyto2Title": "发:",
        //     "copyto2": "[发]",
        //     "editionUnit": "[印发机关]",
        //     "editionDate": "[印发日期]",
        //     "meetingAttendTitle": "出席:",
        //     "meetingLeaveTitle": "请假:",
        //     "meetingSitTitle": "列席:",
        //     "meetingAttend": "",
        //     "meetingLeave": "",
        //     "meetingSit": "",
        //     "meetingRecord": ""
        // }
        // if (callback) callback(data);
        // return Promise.resolve(data);
        return null;
    }

    /**
     * @summary 保存编辑器数据
     * @example
     * service.saveData = function(data){
     *     //data为要保存的数据,格式如下:
     *     {
     *          "docId": "aaaaaaaa"  //文档的唯一标识
     *          "copies": "",
     *          "secret": "",
     *          "priority": "",
     *          "redHeader": "文件红头",
     *          "fileno": "[文号]",
     *          "signerTitle": "签发人:",
     *          "signer": "[签发人]",
     *          "subject": "[文件标题]",
     *          "mainSend": "[主送单位:]",
     *          "filetext": "[请在此处编辑正文内容]",
     *          "attachmentTitle": "附件:",
     *          "attachment": "",
     *          "issuanceUnit": "[发文机关]",
     *          "issuanceDate": "[成文日期]",
     *          "annotation": "",
     *          "copytoTitle": "抄送:",
     *          "copyto": "[抄送]",
     *          "copyto2Title": "发:",
     *          "copyto2": "[发]",
     *          "editionUnit": "[印发机关]",
     *          "editionDate": "[印发日期]",
     *          "meetingAttendTitle": "出席:",
     *          "meetingLeaveTitle": "请假:",
     *          "meetingSitTitle": "列席:",
     *          "meetingAttend": "",
     *          "meetingLeave": "",
     *          "meetingSit": "",
     *          "meetingRecord": "",
     *          ...                                 //其他自定义扩展字段
     *      }
     * };
     */
    async saveData(data){
        return null;
    }


    /**
     * @summary 返回当前文档的手写签批记录(已提交的)列表,返回一个数组列表
     * @param {String} id 当前文档的唯一标识,创建编辑器时的options中的docId
     * @return {Promise<Array>} 返回一个Promise resolve一个存储了手写签批记录的对象数组
     * @example
     * service.listHandwritingLog = async function(docid){
     *  //手写签批记录列表,返回一个数组列表,格式如下:
     *  return Promise.resolve([
     *      //带正文背景保存的记录
     *      {
     *          "status": 3,                                            //签批记录的类别,2表示不带背景保存的记录,3表示带正文背景保存的记录
     *          "image": {                                        //带正文保存的签批图片
     *              "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8",       //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
     *              "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." //签批图片的base64编码或图片地址, 和id二选一,src优先
     *          },
     *          "id": "0d35a43e-8cb5-4af8-ac6a-da681221c350",           //签批记录id,由服务器生成
     *          "activityName": "核稿",                                 //产生签批的步骤
     *          "person": "张三@zhangsan@P",                            //签批的用户
     *          "createTime": "2022-05-30 15:19:13",                    //保存时由服务器自动生成
     *          "updateTime": "2022-05-30 15:19:13",                    //保存时由服务器自动生成
     *          ...     //其他自定义的数据
     *      },
     *      //不带正文背景保存的记录
     *      {
     *          "status": 2,                                            //签批记录的类别,2表示不带背景保存的记录,3表示带正文背景保存的记录
     *          "id": "dc3bc8d1-0d2a-43e6-a44e-9036c058cf70",           //签批记录id,由服务器生成
     *          "activityName": "办理",                                 //产生签批的步骤
     *          "person": "李四@lisi@P",                                //签批的用户
     *          "createTime": "2022-05-30 15:20:43",                    //保存时由服务器自动生成
     *          "updateTime": "2022-05-30 15:20:43",                    //保存时由服务器自动生成
     *          "imageList": [                                    //不带正文保存的签批图片信息
     *              {
     *                  "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8", //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
     *                  "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片的base64编码或图片地址, 和id二选一
     *                  "type": "image",                                 //表示这是一张图片
     *                  "width": "793.671875",                           //所占宽度
     *                  "height": "1000",                                //所占高度
     *                  ... //其他自定义的数据
     *              },
     *              {
     *                  "type": "placeholder",                           //表示这个位置没有图片,只占一个位置
     *                  "width": "793.671875",                           //所占宽度
     *                  "height": "701",                                 //所占高度
     *                  ... //其他自定义的数据
     *              }
     *          ]
     *      }
     *  ])
     *}
     */
    async listHandwritingLog(docid){
        return null;
    }

    /**
     * @summary 实现获取当前处理人编辑的手写数据
     * @param {Object} options 创建编辑器时的options,可以自定义的在这个options设置该手写签批数据的id
     * @return {Promise<Object>} 返回一个Promise resolve一个存储了手写签批数据的对象,如果是新建可以返回 null
     * @example
     *service.getEditedHandwriting = async function( options ){
     *  return Promise.resolve({
     *    "id": "bfc6cc5b-e171-4f1a-83a0-78a40cf6a581", //正在编辑的手写签批id
     *    "activityName": "确认",                       //手写签批的步骤  创建编辑器时的options中的activity.name
     *    "person": "张三@zhangsan@P",                  //签批的用户
     *    "status": 1,                                  //签批类型,1表示正在编辑中,还未提交(提交后不允许编辑)
     *    "inputList": [                                //用输入法输入的文本框
     *        {
     *            "coordinates":{ //用输入法输入的文本框的位置,top\left\right\bottom是相对于编辑器正文内容的位置
     *                "left":10,
     *                "top":30,
     *                "width":200,
     *                "height":100,
     *                "right":700,
     *                "bottom":900
     *            },
     *            "styles":{ //用输入法输入的文本的样式
     *                "color":"#4bacc6",
     *                "font-size":"32px"
     *            },
     *            "html":"手写输入内容" ////用输入法输入的内容
     *        }
     *      ],
     *    "imageList": [                            //用笔画画出的图片列表
     *       {
     *            "id": "4b6f4164-2856-44c8-bd0a-4c43f6b34ff8", //签批图片的id, 和src二选一,如果使用id,需要实现 service.getHandwritingImage 方法
     *            "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片的base64编码或图片地址, 和id二选一,src优先
     *            "width":"793.6875",                                                 //图片宽度
     *            "height":"1000"                                                     //图片高度
     *        },
     *        {
     *            "src": "",                                  //src为空及id为空(或无src及id),表示无该页无签批内容
     *            "width": "793.671875",                                              //占位宽度
     *            "height":"215"                                                      //占位高度
     *        }
     *      ]
     *  })
     * }
     * */
    async getEditedHandwriting(options){
        // try {
        //     // const tmp = new URL(DocEditor.base||"", location);
        //     // const url = new URL(`public/test/documentversion/${id}.json`, tmp);
        //     const url = URL.resolve(this.base, `public/test/handwriting/${id}.json`);
        //     const res = await whatwgFetch(url);
        //     const json = await res.json();
        //     const patchs = JSON.parse(json.data.data);
        //     json.data.json = patchs;
        //     return json.data;
        // }catch(err){
        //     console.error(err);
        // }
        return null;
    }

    /**
     * @summary 根据图片id获取图片地址或者是图片base64编码后的数据
     * @param {String} imageId 根据getEditedHandwriting或listHandwritingLog方法返回的数据中包含的图片id
     * @param {Number} status 获取图片的类型,1表示正在编辑的手写签批图片,2表示签批历史记录里不带正文背景的图片,3表示历史记录里带正文背景的图片
     * @return {Promise<Object>} 返回一个Promise resolve 的图片地址或者是图片base64编码后的数据
     * @example
     *service.getHandwritingImage = async function( imageId, status ) {
     *   switch (status) {
     *       case 1:
     *           return "http://www.o2oa.net/handwriting/edting/"+imageId;
     *       case 2:
     *           return "http://www.o2oa.net/handwriting/without/"+imageId;
     *       case 3:
     *           return "http://www.o2oa.net/handwriting/with/"+imageId;
     *   }
    *}
    * @example
    *service.getHandwritingImage = function( imageId, status ) {
    *    return Promise.resolve( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." )
    *}
     **/
    async getHandwritingImage(imageId, status){
        return null;
    }

    /**
     * @summary 保存手写签批数据
     * @example
     * service.saveHandwriting = async function(data){
     *     //data为要保存的数据,格式如下:
     *     {
     *       "docId": "aaaaa",                 //当前文档的唯一标识,创建编辑器时的options中的docId
     *       "id": "bbbbbbbb",                 //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
     *       "activityName": "确认",                       //手写签批的步骤  创建编辑器时的options中的activity.name
     *       "person": "张三@zhangsan@P",                  //签批的用户
     *       "status": 1,                                  //签批类型,1表示正在编辑中,还未提交(提交后不允许编辑)
     *       "inputList": [                                //用输入法输入的文本框
     *           {
     *            "coordinates":{ //用输入法输入的文本框的位置,top\left\right\bottom是相对于编辑器正文内容的位置
     *                "left":10,
     *                "top":30,
     *                "width":200,
     *                "height":100,
     *                "right":700,
     *                "bottom":900
     *            },
     *            "styles":{ //用输入法输入的文本的样式
     *                "color":"#4bacc6",
     *                "font-size":"32px"
     *            },
     *            "html":"手写输入内容" ////用输入法输入的内容
     *        }
     *      ],
     *    "imageList": [                            //用笔画画出的图片列表
     *       {
     *            "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片base64编码,
     *            "width":"793.6875",                                                 //图片宽度
     *            "height":"1000"                                                     //图片高度
     *        },
     *        {
     *            "src": "",                                                          //src为空表示无该页无签批内容
     *            "width": "793.671875",                                              //占位宽度
     *            "height":"215"                                                      //占位高度
     *        }
     *      ]
     *  }
     *}
     */
    async saveHandwriting(data){
        return null;
    }


    /**
     * @summary 不带正文背景提交手写签批,提交后不允许编辑这份签批
     * @example
     * service.submitHandwritingWithoutDoc = async function(data){
     *     //data为要保存的数据,格式如下:
     *     {
     *       "docId": "aaaaa",                 //当前文档的唯一标识,创建编辑器时的options中的docId
     *       "id": "bbbbbbbb",                //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
     *       "activityName": "确认",                       //手写签批的步骤  创建编辑器时的options中的activity.name
     *       "person": "张三@zhangsan@P",                  //签批的用户
     *       "status": 2,                                  //签批类型,2表示不带背景提交
     *       "imageList": [                            //用笔画画出的图片列表
     *          {
     *            "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA...", //签批图片base64编码,
     *            "width":"793.6875",                                                 //图片宽度
     *            "height":"1000"                                                     //图片高度
     *          },
     *          {
     *            "src": "",                                                          //src为空表示无该页无签批内容
     *            "width": "793.671875",                                              //占位宽度
     *            "height":"215"                                                      //占位高度
     *          }
     *      ]
     *  }
     *}
     */
    async submitHandwritingWithoutDoc(data){
        return null;
    }

    /**
     * @summary 带正文背景提交手写签批,提交后不允许编辑这份签批。需要后台将html内容转换成图片
     * @example
     * service.submitHandwritingWithDoc = async function(data){
     *     //data为要保存的数据,格式如下:
     *     {
     *       "docId": "aaaaa",                 //当前文档的唯一标识,创建编辑器时的options中的docId
     *       "id": "bbbbbbbb",                 //当前签批的唯一标识,依赖于getEditedHandwriting获取的数据是否包含id。如果没有,表示新建。
     *       "activityName": "确认",                       //手写签批的步骤  创建编辑器时的options中的activity.name
     *       "person": "张三@zhangsan@P",                  //签批的用户
     *       "status": 3,                                  //签批类型,3表示带正文背景提交
     *       "htmlContent": "<div>....</div>",              //包含正文和手写签批图片的html内容,需要后台
     *       "htmlWidth": "793.671875",                     //html内容的宽度
     *       "htmlHeight": "1000"                           //html内容的高度
     *      }
     *}
     */
    async submitHandwritingWithDoc(data){
        return null;
    }

    /**
     * @summary html转图片,此方法用在输入法输入的内容。如果不使用输入法,可以不实现该方法
     * @param {Object} data 转换的html数据
     * <pre><code class='language-js'>
     *     //格式如下:
     *     {
     *           workHtml: div.outerHTML,
     *           htmlWidth: 200, //html正文宽度,允许为空.
     *           htmlHeight: 300, //html正文高度,允许为空.
     *           startX: 10,    //html的X轴开始位置,允许为空.
     *           startY: 20,    //html的Y轴开始位置,允许为空.
     *           omitBackground: true //背景是否透明
     *      }
     * </code></pre>
     * @return {Promise<Object>} 返回一个Promise resolve 的图片地址或者是图片base64编码后的数据
     * @example
     * service.htmlToImage = async function(data){
     *      return Promise.resolve( "http://www.o2oa.net/handwriting/12345" );
     *}
     * @example
     * service.htmlToImage = function(data){
     *      return Promise.resolve( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAA..." )
     *}
     */
    async htmlToImage(data){
        return null;
    }

}
export default Service;