Selaa lähdekoodia

质量经验库

李士越 1 vuosi sitten
vanhempi
commit
cb2890ad71

+ 3 - 2
wwwroot/Web.config

@@ -36,9 +36,10 @@
 	<system.web>
 		<customErrors mode="Off"/>
 		<compilation targetFramework="4.0" debug="true"/>
-		<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false"/>
-		<httpRuntime/>
+		<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false"/> 
 		<!--<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="1440"/>-->
+		<!--验证版本过高 会拦截富文本编辑器中的标签-->
+		<httpRuntime requestValidationMode="2.0"/>
 	</system.web>
 	<system.data>
 		<DbProviderFactories>

+ 172 - 0
wwwroot/mes/pc/intelligence/Richtext.ashx

@@ -0,0 +1,172 @@
+<%@ WebHandler  Language="C#" Class="Richtext" %>
+using System;
+using System.Web;
+using System.Web.SessionState;
+using System.Linq;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+using Curtain.DataAccess;
+using System.Data;
+
+
+public class Richtext : IHttpHandler, IReadOnlySessionState
+{
+
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+        //上传文件
+        if (context.Request["m"].ToString() == "0")
+        {
+            string guid = Guid.NewGuid().ToString().Split('-')[0];
+            string filePath = "/mes/upload/" + DateTime.Now.ToString("yyyy-MM-dd");
+            System.IO.Directory.CreateDirectory(context.Server.MapPath(filePath));
+            string fileName = filePath + "/" + DateTime.Now.ToString("yyyy-MM-dd") + "-" + guid + "-" + context.Request.Files[0].FileName.Split('.')[0];
+            fileName += System.IO.Path.GetExtension(context.Request.Files[0].FileName);
+            string diskFileName = context.Server.MapPath(fileName);
+            if (System.IO.File.Exists(diskFileName)) System.IO.File.Delete(diskFileName);
+            context.Request.Files[0].SaveAs(diskFileName);
+            Dictionary<string, object> result = new Dictionary<string, object>();
+            result.Add("errno", 0);
+            result.Add("data", new Dictionary<string, string>()
+            {
+            {"url","http://localhost:62173"+fileName }
+            });
+            context.Response.Write(JsonConvert.SerializeObject(result, Formatting.Indented));
+        }
+        //获取产品型号
+        if (context.Request["m"].ToString() == "getproductmodel")
+        {
+            using (IDataAccess conn = DataAccess.Create())
+            {
+                string sqlStr = @"SELECT GOODSID AS ID, GOODSCODE FROM TP_MST_GOODS WHERE VALUEFLAG=1";
+                DataTable dt = conn.ExecuteDatatable(sqlStr);
+                context.Response.Write(JsonConvert.SerializeObject(dt, Formatting.Indented));
+            }
+        }
+        //添加记录 
+        if (context.Request["m"].ToString() == "add")
+        {
+            //获取前端传递的表单
+            var formData = context.Request.Form;
+            using (IDataAccess conn = DataAccess.Create())
+            {
+                if (formData["id"].ToString() != "")
+                {
+                    conn.ExecuteNonQuery(
+                      " UPDATE  TP_PM_QUALITYLIBRARY SET " +
+                      "VALUEFLAG=0 WHERE LIBRARYID=" + formData["id"].ToString());
+                }
+                //创建记录
+                DataTable dt = conn.ExecuteDatatable(@"SELECT SEQ_PM_QUALITYLIBRARY_ID.nextval  FROM dual");
+                int result = conn.ExecuteNonQuery(@"
+                INSERT INTO TP_PM_QUALITYLIBRARY (
+                    LIBRARYID,--总单ID
+                    LIBRARYNAME, --项目名称
+                    GOODSID,--产品ID
+                    GOODSCODE,--产品编码(产品型
+                    PARTICIPANTS,--参与人员
+                    QUESTION,--问题
+                    SOLUTION,--解决方式
+                    SOLUTIONEFFECT,--解决效果
+                    ANNEX,--项目相关资料(附件)
+                    ACCOUNTID,CREATEUSERID,UPDATEUSERID
+                ) VALUES (
+                    @LIBRARYID@,
+                    @LIBRARYNAME@,
+                    @GOODSID@,
+                    @GOODSCODE@,
+                    @PARTICIPANTS@,
+                    @QUESTION@,
+                    @SOLUTION@,
+                    @SOLUTIONEFFECT@,
+                    @ANNEX@, 
+                    @ACCOUNTID@,@CREATEUSERID@,@UPDATEUSERID@
+                )
+                ",
+               new CDAParameter("LIBRARYID", dt.Rows[0][0]),
+               new CDAParameter("LIBRARYNAME", formData["name"]),
+               new CDAParameter("GOODSID", formData["modelid"]),
+               new CDAParameter("GOODSCODE", formData["modelname"]),
+               new CDAParameter("PARTICIPANTS", formData["participants"]),
+               new CDAParameter("QUESTION", formData["problem"]),
+               new CDAParameter("SOLUTION", formData["solution"]),
+               new CDAParameter("SOLUTIONEFFECT", formData["solutioneffect"]),
+               new CDAParameter("ANNEX", formData["annex"]),
+               new CDAParameter("ACCOUNTID", HttpContext.Current.Session["accountId"]),
+               new CDAParameter("CREATEUSERID", HttpContext.Current.Session["userId"]),
+               new CDAParameter("UPDATEUSERID", HttpContext.Current.Session["userId"]));
+                context.Response.Write(JsonConvert.SerializeObject(result == 1 ? dt.Rows[0][0] : "false", Formatting.Indented));
+            }
+
+        }
+        //获取所有(单个记录)
+        if (context.Request["m"].ToString() == "get")
+        {
+            //获取前端传递的表单
+            var formData = context.Request.Form;
+            int id = formData["id"] != null ? int.Parse(formData["id"].ToString()) : 0;
+            using (IDataAccess conn = DataAccess.Create())
+            {
+
+                string sqlStr = "SELECT Q.*,U.USERNAME FROM TP_PM_QUALITYLIBRARY Q LEFT JOIN TP_MST_USER U ON Q.CREATEUSERID=U.USERID WHERE Q.VALUEFLAG=1";
+                if (id != 0)
+                {
+                    sqlStr += "AND Q.LIBRARYID=" + id;
+                }
+                sqlStr += "ORDER BY q.CREATETIME DESC";
+                DataTable dt = conn.ExecuteDatatable(sqlStr);
+                List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
+
+                for (int i = 0; i < dt.Rows.Count; i++)
+                {
+                    Dictionary<string, string> content = new Dictionary<string, string>();
+                    //id
+                    content.Add("id", dt.Rows[i]["LIBRARYID"].ToString());
+                    //项目名称
+                    content.Add("name", dt.Rows[i]["LIBRARYNAME"].ToString());
+                    //产品型号id
+                    content.Add("modelid", dt.Rows[i]["GOODSID"].ToString());
+                    //产品型号
+                    content.Add("modelname", dt.Rows[i]["GOODSCODE"].ToString());
+                    //参与人员
+                    content.Add("participants", dt.Rows[i]["PARTICIPANTS"].ToString());
+                    //问题
+                    content.Add("problem", dt.Rows[i]["QUESTION"].ToString());
+                    //解决方式
+                    content.Add("solution", dt.Rows[i]["SOLUTION"].ToString());
+                    //解决效果
+                    content.Add("solutioneffect", dt.Rows[i]["SOLUTIONEFFECT"].ToString());
+                    //附件
+                    content.Add("annex", dt.Rows[i]["ANNEX"].ToString());
+                    //创建时间
+                    content.Add("createtime", dt.Rows[i]["CREATETIME"].ToString());
+                    //创建人
+                    content.Add("username", dt.Rows[i]["USERNAME"].ToString());
+                    result.Add(content);
+                }
+                context.Response.Write(JsonConvert.SerializeObject(result, Formatting.Indented));
+            }
+        }
+        //删除文件
+        if (context.Request["m"].ToString() == "deletefile")
+        {
+            //获取前端传递的表单
+            var formData = context.Request.Form;
+            int id = formData["id"] != null ? int.Parse(formData["id"].ToString()) : 0;
+            using (IDataAccess conn = DataAccess.Create())
+            {
+                int result = conn.ExecuteNonQuery(" UPDATE TP_PM_QUALITYLIBRARY   SET ANNEX=null  WHERE LIBRARYID=" + formData["id"].ToString());
+                context.Response.Write(JsonConvert.SerializeObject(result, Formatting.Indented));
+            }
+        }
+    }
+
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+}   

+ 437 - 0
wwwroot/mes/pc/intelligence/Richtext.html

@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script> 
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" /> 
+    <link href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css" rel="stylesheet">
+    <style> 
+        .ddd {
+            padding-top: 10px;
+            margin: 0 20px;
+            font-size: 20px
+        }
+
+        .inp {
+            width: 100%;
+            height: 32px;
+            position: relative;
+            /* 设置边框样式,以便更容易看到圆角效果 */
+            border: 2px solid #ccc;
+            /* 设置圆角半径 */
+            border-radius: 10px; /* 你可以根据需要调整这个值 */
+        }
+
+        select {
+            width: 100%;
+            height: 32px;
+            position: relative;
+            background-color: #444;
+            color: #fff;
+            /* 设置边框样式,以便更容易看到圆角效果 */
+            border: 2px solid #ccc;
+            /* 设置圆角半径 */
+            border-radius: 10px; /* 你可以根据需要调整这个值 */
+        }
+
+        .bbb {
+            margin: 0 20px;
+            font-size: 20px;
+            width: 400px;
+            border: 0;
+            padding: 0 10px;
+            background-color: #666;
+        }
+
+        .top {
+            display: flex;
+            justify-content: space-between; /* 可选,用于在元素之间添加空间,但在这个例子中可能不是必需的 */
+            width: 100%; /* 确保 .top 容器占据其父容器的全部宽度 */
+        }
+        #editor—wrapper {
+            border: 1px solid #ccc;
+            z-index: 100; /* 按需定义 */
+            height:100%;
+            width:99%;
+            margin:auto;
+        }
+
+        #toolbar-container {
+            border-bottom: 1px solid #ccc;
+        }
+
+        #editor-container {
+            height: 450px;
+        } 
+    </style>
+</head>
+<body class="easyui-layout">
+    <div id="toolbarLayout" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+        <div style="min-height: 100vh; ">
+            <div>
+                <div class="top">
+                    <div class="ddd" style=" flex: 1;">
+                        <span>产品名称:<input id="input_name" class="inp" type="text"></span>
+                    </div>
+                    <div class="ddd" style=" flex: 1;">
+                        <span>产品型号:</span>
+                        <select id="modelSelect">
+                            <option disabled selected value="">请选择型号</option>
+                        </select>
+                    </div>
+                </div>
+                <div class="ddd">
+                    <span>参与人员:<input id="input_participants" class="inp" type="text"> </span>
+                </div>
+                <div class="ddd">
+                    <span>解决方式:<input id="input_solution" class="inp" type="text"> </span>
+                </div>
+                <div class="ddd">
+                    <span>解决效果:<input id="input_solutioneffect" class="inp" type="text"> </span>
+                </div>
+                <form enctype="multipart/form-data">
+                    <div id="presetFileName" class="ddd">
+                        <span id="filename"></span>
+                        <button type="button" class="ddd" style="padding-top:0; " onclick="deletefile()">删除</button>
+                        <button type="button" class="ddd" style="padding-top:0; " onclick="downfile()">下载已上传文件</button>
+                    </div>
+                   
+                    <div id="isopen" class="ddd">
+                        上传附件:
+                        <input id="ff" type="file" style=" font-size: 20px" data-options="required:true,prompt:'',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept='*/*'">
+                        <button type="button" class="ddd" style="padding-top:0; " onclick="submitForm()">导入</button>
+                        <span style="color:red">上传附件后请点击导入按钮否则不会上传至服务器</span>
+                    </div>
+                </form>
+            </div>
+            <div style=" padding-top:10px">
+                <span class="ddd">问题: </span>
+                <div id="editor—wrapper">
+                    <div id="toolbar-container"><!-- 工具栏 --></div>
+                    <div id="editor-container"><!-- 编辑器 --></div>
+                    <div id="editor-text-area" class="editor-text-area"></div>
+                </div>
+            </div>
+            <div class="ddd" >
+                <button type="button" class="ddd" style="padding-top: 0; " onclick="add()">提交/修改</button>
+            </div>
+        </div>
+    </div> 
+    <script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
+    <script>
+        //加载前调用
+        $(document).ready(function () {
+            getproductmodel();
+            getQueryParam();
+        });
+        //创建富文本编辑器初始对象
+        const E = window.wangEditor
+        //语言切换(没用上 放着吧)
+        const LANG = location.href.indexOf('lang=en') > 0 ? 'en' : 'zh-CN'
+        E.i18nChangeLanguage(LANG)
+        //创建初始项
+        const editorConfig = {
+            //自定义配置项
+            MENU_CONF: {},
+            //将画布上的内容添加到对象中
+            onChange(editor) {
+                const html = editor.getHtml()
+                addsb.problem = html;
+            },
+        }
+        //上传图片
+        editorConfig.MENU_CONF['uploadImage'] = {
+            server: 'Richtext.ashx?m=0',
+        }
+        // 上传视频
+        editorConfig.MENU_CONF['uploadVideo'] = { 
+            server: 'Richtext.ashx?m=0',
+        }
+        //画布初始化
+        const editor = E.createEditor({
+            selector: '#editor-container',
+            html: '<p><br></p>',
+            config: editorConfig,
+            mode: 'default', 
+        })
+        //顶栏自定义
+        const toolbarConfig = {}
+        //顶栏配置项
+        const toolbar = E.createToolbar({
+            editor,
+            selector: '#toolbar-container',
+            config: toolbarConfig,
+            mode: 'default', // or 'simple'
+        })
+       
+        // 响应式数据:产品型号列表
+        let models = [];
+        /** 加载型号到 select 元素中  */
+        const loadModelsToSelect=()=> {
+            const select = document.getElementById('modelSelect');
+            // 遍历模型数组并添加选项 
+            models.forEach(model => {
+                const option = document.createElement('option');
+                option.value = model.ID;
+                option.textContent = model.GOODSCODE;
+                select.appendChild(option);
+            }); 
+            // 设置默认选中的型号  
+            if (addsb.modelid) {
+                const selectedOption = select.querySelector(`option[value="${addsb.modelid}"]`);
+                if (selectedOption) {
+                    selectedOption.selected = true;
+                }
+            }
+            // 监听选择变化
+            select.addEventListener('change', function () {
+                // 更新 addsb.model
+                addsb.modelid = this.value;
+                addsb.modelname = models.find(ex => ex.ID == addsb.modelid).GOODSCODE;
+            });
+        };
+        //提交内容
+        const addsb = {
+            /**id*/
+            id: '',
+            /**项目名称*/
+            name: '',
+            /**产品型号id*/
+            modelid: '',
+            /**产品型号*/
+            modelname: '',
+            /**参与人员*/
+            participants: '',
+            /**问题*/
+            problem: '',
+            /**解决方式*/
+            solution: '',
+            /**解决效果*/
+            solutioneffect: '',
+            /**附件*/
+            annex: ''
+        };
+        /**监视输入框*/
+        $('#input_name, #input_participants,#input_solution,#input_solutioneffect').on('input', function () {
+            const key = this.id.replace('input_', '');;
+            addsb[key] = $(this).val(); 
+        });
+        
+        /** 添加/修改按钮  */
+        const add = () => { 
+            if (addsb.name == '') {
+                alert('请填写产品名称');
+                return;
+            }
+            if (addsb.model == '') {
+                alert('请填写产品型号');
+                return;
+            }
+            $.ajax({
+                url: "Richtext.ashx?m=add",
+                type: "POST",
+                data: addsb,
+                //要传递json时
+                // contentType: "application/json; charset=utf-8",  
+                // data: JSON.stringify(formData),  
+                success: function (data) { 
+                    history.pushState(null, null, '?id=' + parseInt(data, 10)); 
+                    getQueryParam();
+                },
+                error: function (xhr, status, error) {
+                    console.error("请求失败: " + error);
+                } 
+            });
+        }
+        /** 上传附件 */
+        const submitForm = () => {
+            /**找到id为ff的文件上传框*/
+            var fileInput = document.getElementById('ff');
+            /**找到上传文件*/
+            var file = fileInput.files[0];
+            /**创建文件对象*/
+            var formData = new FormData();
+            formData.append('file', file);
+            /**创建连接*/
+            var xhr = new XMLHttpRequest();
+            xhr.open('POST', '/mes/pc/intelligence/Richtext.ashx?m=0', true);
+            /**发送文件*/
+            xhr.send(formData);
+            /**返回值赋值*/
+            xhr.onload = function () {
+                if (xhr.status === 200) { 
+                    try {
+                       /**将JSON字符串解析为JavaScript对象 */
+                        var responseData = JSON.parse(xhr.response);
+                       /**检查errno是否为0,以确认请求成功  */
+                        if (responseData.errno === 0) {
+                            /**设置addsb.annex为响应中的url  */
+                            addsb.annex = responseData.data.url;
+                            messager(true);
+                        } else {
+                            console.error('请求成功但发生错误', responseData.errno);
+                            messager(false);
+                        }
+                    } catch (e) {
+                        console.error('解析JSON失败', e);
+                        messager(false);
+                    }
+                } else {
+                    console.error('请求失败', xhr.status);
+                    messager(false);
+                }
+            }
+        };
+        /**消息提示*/
+        const messager = (type) => {
+            $.messager.show({
+                title: type ? '上传成功' :"上传失败",
+                msg: type ?'文件成功上传至服务器':'文件上传服务器失败',
+                showType: 'slide', 
+                style: {
+                    right: '',
+                    top: document.body.scrollTop + document.documentElement.scrollTop,
+                    bottom: '' 
+                }
+            });
+        }
+        /** 获取产品型号 */
+        const getproductmodel = () => {
+            $.get("Richtext.ashx?m=getproductmodel", function (data) {
+                var json = JSON.parse(data); 
+                models = json; 
+                loadModelsToSelect();
+            })
+        }; 
+        /** 获取当前记录 */
+        const getlibrary = async (libraryid) => {
+            return new Promise((resolve, reject) => {
+                $.ajax({
+                    url: "Richtext.ashx?m=get",
+                    type: "POST",
+                    data: { id: libraryid },
+                    dataType: "json",
+                    success: function (response) {
+                        if (response && response.length > 0) {
+                            const data = response[0];
+                            addsb.id = data.id;
+                            addsb.name = data.name;
+                            addsb.modelid = data.modelid;
+                            addsb.modelname = data.modelname;
+                            addsb.participants = data.participants;
+                            addsb.problem = data.problem;
+                            addsb.solution = data.solution;
+                            addsb.solutioneffect = data.solutioneffect;
+                            addsb.annex = data.annex;
+                            // 设置输入框的初始值   
+                            input_name.value = addsb.name;
+                            input_participants.value = addsb.participants;
+                            input_solution.value = addsb.solution;
+                            input_solutioneffect.value = addsb.solutioneffect;
+                            //异步完成标识
+                            resolve();
+                        } else {
+                            reject(new Error("没有获取到有效的数据"));
+                        }
+                    },
+                    error: function (xhr, status, error) {
+                        reject(new Error("请求失败: " + error));
+                    }
+                });
+            }); 
+        };
+        /**获取url内的id */
+        const getQueryParam = async () => {
+            let libraryIdFound = false;
+            let libraryPromise = null;
+            // 获取URL的查询字符串部分  
+            var search = window.location.search.substring(1);
+            // 将查询字符串分割成键值对数组  
+            var params = search.split("&");
+            for (var i = 0; i < params.length; i++) {
+                var val = params[i].split("=");
+                // 如果找到了匹配的参数名,则返回其值  
+                if (val[0] == 'id') {
+                    libraryIdFound = true;
+                    libraryPromise = getlibrary(val[1]);
+                    break;
+                }
+            } 
+            if (libraryIdFound) { 
+                 // 等待getlibrary完成  
+                await libraryPromise; 
+            } 
+            opendiv();
+            loadModelsToSelect(); 
+        };
+        /**删除按钮 */
+        const deletefile = () => {
+            //文件重新赋值
+            addsb.annex = '';
+            /**上传附件 */
+            let isopen = document.getElementById('isopen');
+            //展示
+            isopen.style.display = 'block';
+            /**显示附件 */
+            let presetFileName = document.getElementById('presetFileName');
+            // 隐藏文件输入字段
+            presetFileName.style.display = 'none';
+            //调用删除附件(只是删除数据库,物理路径并未删除)
+            $.ajax({
+                url: "Richtext.ashx?m=deletefile",
+                type: "POST",
+                data: { id: addsb.id },
+            })
+        };
+        /**下载附件 */
+        const downfile = () => { 
+            var a = document.createElement("a");
+            a.href = addsb.annex;
+            a.download = addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1);
+            document.body.appendChild(a);
+            a.click();
+            document.body.removeChild(a);
+        };
+        /**判断是否开启div*/
+        const opendiv = () => {
+            /**上传附件 */
+            let isopen = document.getElementById('isopen');
+            /**显示附件 */
+            let presetFileName = document.getElementById('presetFileName');
+            //判断上传文档是否开启    
+            if (addsb.annex) { 
+                // 隐藏
+                isopen.style.display = 'none';
+                let filename = document.getElementById('filename');
+                filename.innerHTML = '已上传文件: ' + addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1); 
+                presetFileName.style.display = 'block';
+            } else {  
+                presetFileName.style.display = 'none';
+                isopen.style.display = 'block';
+            }
+            // 假设您已经有一个全局的编辑器实例变量 `editor`  
+            if (editor && typeof editor.setHtml === 'function') {
+                // 设置编辑器的内容为从服务器返回的问题数据  
+                editor.setHtml(addsb.problem);
+            }
+        }
+    </script>
+</body>
+</html >

+ 113 - 0
wwwroot/mes/pc/intelligence/intelligence.ashx

@@ -0,0 +1,113 @@
+<%@ WebHandler Language="C#" Class="intelligence" %>
+using System.Web;
+using System.Web.SessionState;
+using System.Data;
+using System.Collections.Generic;
+using Curtain.DataAccess;
+using Newtonsoft.Json;
+
+public class intelligence : IHttpHandler, IReadOnlySessionState
+{
+    public void ProcessRequest(HttpContext context)
+    {
+        context.Response.ContentType = "text/plain";
+        //筛选记录
+        if (context.Request["m"].ToString() == "getcontent")
+        {
+            //获取前端传递的表单
+            var formData = context.Request.Form;
+            //开始时间 
+            string opentime = formData["opentime"] != null ? formData["opentime"].ToString() : null;
+            //结束时间 
+            string closetime = formData["closetime"] != null ? formData["closetime"].ToString() : null;
+            //项目名称
+            string name = formData["name"] != null ? formData["name"].ToString() : null;
+            //参与人员 
+            string people = formData["people"] != null ? formData["people"].ToString() : null;
+            //产品型号 
+            string modelid = formData["modelid"] != null ? formData["modelid"].ToString() : null;
+            using (IDataAccess conn = DataAccess.Create())
+            {
+                string sqlStr = "SELECT Q.*,U.USERNAME FROM TP_PM_QUALITYLIBRARY Q LEFT JOIN TP_MST_USER U ON Q.CREATEUSERID=U.USERID WHERE Q.VALUEFLAG=1 ";
+                //添加开始时间
+                if (opentime != string.Empty)
+                {
+                    sqlStr += " AND Q.CREATETIME  >= TO_date('" + opentime.Trim() + " 00:00:00' ,'yy-mm-dd hh24:mi:ss')";
+                }
+                //添加结束时间
+                if (closetime !=  string.Empty)
+                {
+                    sqlStr += " AND Q.CREATETIME  <= TO_date('" + closetime.Trim() + " 23:59:59' ,'yy-mm-dd hh24:mi:ss')";
+                }
+                //添加项目名陈
+                if (name !=  string.Empty)
+                {
+                    sqlStr += " AND Q.LIBRARYNAME LIKE '%" + name.Trim() + "%'";
+                }
+                //添加产品型号
+                if (modelid != string.Empty)
+                {
+                    sqlStr += " AND Q.GOODSID = " + modelid;
+                }
+                //添加参与人员
+                if (people !=  string.Empty)
+                {
+                    bool a = true;
+                    foreach (var item in people.Split('/'))
+                    {
+                        if (a)
+                        {
+                            sqlStr += " AND (Q.PARTICIPANTS LIKE '%" + item.Trim() + "%'";
+                            a = false;
+                        }
+                        else
+                        {
+                            sqlStr += " OR Q.PARTICIPANTS LIKE '%" + item.Trim() + "%'";
+                        }
+
+
+                    }
+                    sqlStr += ")";
+                }
+                DataTable dt = conn.ExecuteDatatable(sqlStr);
+                List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
+
+                for (int i = 0; i < dt.Rows.Count; i++)
+                {
+                    Dictionary<string, string> content = new Dictionary<string, string>();
+                    //id
+                    content.Add("id", dt.Rows[i]["LIBRARYID"].ToString());
+                    //项目名称
+                    content.Add("name", dt.Rows[i]["LIBRARYNAME"].ToString());
+                    //产品型号id
+                    content.Add("modelid", dt.Rows[i]["GOODSID"].ToString());
+                    //产品型号
+                    content.Add("modelname", dt.Rows[i]["GOODSCODE"].ToString());
+                    //参与人员
+                    content.Add("participants", dt.Rows[i]["PARTICIPANTS"].ToString());
+                    //问题
+                    content.Add("problem", dt.Rows[i]["QUESTION"].ToString());
+                    //解决方式
+                    content.Add("solution", dt.Rows[i]["SOLUTION"].ToString());
+                    //解决效果
+                    content.Add("solutioneffect", dt.Rows[i]["SOLUTIONEFFECT"].ToString());
+                    //附件
+                    content.Add("annex", dt.Rows[i]["ANNEX"].ToString());
+                    //创建时间
+                    content.Add("createtime", dt.Rows[i]["CREATETIME"].ToString());
+                    //创建人
+                    content.Add("username", dt.Rows[i]["USERNAME"].ToString());
+                    result.Add(content);
+                }
+                context.Response.Write(JsonConvert.SerializeObject(result, Formatting.Indented));
+            }
+        }
+    }
+    public bool IsReusable
+    {
+        get
+        {
+            return false;
+        }
+    }
+}

+ 274 - 0
wwwroot/mes/pc/intelligence/intelligence.html

@@ -0,0 +1,274 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="keywords" content="dongke,mes,ibossmes">
+    <meta name="description" content="制造企业生产过程执行管理系统">
+    <meta name="author" content="xuwei">
+    <title>东科软件</title>
+    <link rel="shortcut icon" href="/img/logo.png" />
+    <link rel="bookmark" href="/img/logo.png" />
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
+    <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
+    <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
+    <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
+    <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
+    <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" /> 
+    <style>
+        .inp {
+            width: 120px;
+            height: 28px;
+            border: 0;
+        }
+        .combobox {
+            color: #fff;
+            background-color: #444;
+        }
+    </style>
+</head>
+<body class="easyui-layout">
+    <div id="toolbarLayout" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
+        <!--工具条-->
+        <div id="tb" class="i-toolbar">
+            <a class="easyui-linkbutton" iconcls="icon-add" plain="true" onclick="jump()">添加</a>
+            <a class="easyui-linkbutton" iconcls="icon-edit" plain="true" onclick="tbReportEdit()">修改</a> 
+            <a class="easyui-linkbutton" iconcls="icon-excel" plain="true" onclick="tbExport()">导出</a>
+            <a class="easyui-linkbutton" iconcls="icon-reload" plain="true" onclick="restore()">刷新</a>
+            <a class="easyui-linkbutton" iconcls="icon-print" plain="true" onclick="downfile()">下载附件</a>
+            <div id="tbSearchDiv" style="display: block; padding: 10px;">
+                <div>
+                    时间:
+                    <input id="opentime" type="text" class="easyui-datebox" style="width:165px; height:32px;">
+                    -
+                    <input id="closetime"  type="text" class="easyui-datebox" style="width:165px; height:32px;">
+
+                </div>
+                <div style="padding-top:10px;">
+                    项目名称:
+                    <input id="name" class="inp">
+                    参与人员:
+                    <input id="people" class="inp" placeholder="多人请用/进行连接"> 
+                        <select id="modelSelect"  class="combobox inp">
+                            <option  selected value="">请选择型号</option>
+                        </select> 
+                    <a class="easyui-linkbutton" onclick="select()">搜索</a>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div id="tableLayout" data-options="singleSelect:true,border:false,region:'center',split:true,title:'',iconCls:'icon-grid'" title="East" style="width:700px;">
+        <div id="tableTabs" class="easyui-tabs" data-options="singleSelect:true,border:false" style="width: 100%; height: 100%">
+            <div title="质量经验库">
+                <table id="myTable"  class="easyui-datagrid" data-options="method:'get',border:false,fit:true,fitColumns:true">
+                    <thead>
+                        <tr>
+                            <th data-options="field:'id',title:'id',align:'center',sortable:false,hidden:true"></th>
+                            <th data-options="field:'name',title:'项目名称',align:'center',sortable:false"></th>
+                            <th data-options="field:'modelid',title:'产品ID',align:'center',sortable:false,hidden:true"></th>
+                            <th data-options="field:'modelname',title:'产品编码',align:'center',sortable:false"></th>
+                            <th data-options="field:'participants',title:'参与人员',align:'center',sortable:false"></th>
+                            <th data-options="field:'problem',title:'问题',align:'center',sortable:false"></th>
+                            <th data-options="field:'solution',title:'解决方式',align:'center',sortable:false"></th>
+                            <th data-options="field:'solutioneffect',title:'解决效果',align:'center',sortable:false"></th> 
+                            <th data-options="field:'showannex',title:'项目相关资料',align:'center',sortable:false"></th>
+                            <th data-options="field:'createtime',title:'创建时间',align:'center',sortable:false"></th>
+                            <th data-options="field:'username',title:'创建人',align:'center',sortable:false"></th>
+                        </tr>
+                    </thead> 
+                </table>
+            </div>
+        </div>
+    </div>
+    <script>
+        /**加载前调用*/
+        $(document).ready(function () {
+            getcontent();
+            getproductmodel();
+        }); 
+        /**导出*/
+        const tbExport=() =>{
+            /**中文标题映射 */
+            const fieldMap = {
+                'name': '项目名称',
+                'modelname': '产品编码',
+                'participants': '参与人员',
+                'problem': '问题',
+                'solution': '解决方式',
+                'solutioneffect': '解决效果',
+                'showannex': '项目相关资料',
+                'createtime': '创建时间',
+                'username': '创建人'
+            };
+            //加载表头
+            const fields = $('#myTable').datagrid('getColumnFields'); 
+            const headers = [];
+            for (var i = 0; i < fields.length; i++) {
+                var chineseHeader = fieldMap[fields[i]] || fields[i];
+                headers.push(chineseHeader); 
+            } 
+            $('#myTable').datagridExport({
+                headers: headers,
+                fileName: '导出数据(质量经验库).xls',
+                workSheet: '导出数据(质量经验库)'
+                //,dataType: 'text'
+            });
+        };
+        /**添加 */
+        const jump = () => {
+            parent.window.location.href = 'Richtext.html';
+        };
+        /**获取所有内容 */
+        const getcontent = () => {
+            $.get("/mes/pc/intelligence/Richtext.ashx?m=get", function (data) {
+                /**填充表格*/
+                toshow(data);
+            })
+        };
+        /**刷新 */
+        const restore = () => {
+            /**重置data输入框*/
+            $('#opentime, #closetime').datebox(); 
+            /** 重置文本输入框的值*/
+            document.getElementById('name').value = '';
+            document.getElementById('people').value = '';
+            /**重置下拉选择框的值(选择第一个选项,即默认选项)*/
+            var selectElement = document.getElementById('modelSelect');
+            selectElement.selectedIndex = 0;
+            /** 使read恢复初始状态  */
+            read = Object.assign({}, {
+                opentime: '',
+                closetime: '',
+                name: '',
+                people: '',
+                modelid: ''
+            });
+            /**获取所有内容*/
+            getcontent();
+        }
+        /**填充表格*/
+        const toshow = (data) => {
+            //将数据转换成json
+            var json = JSON.parse(data);
+            //遍历数据
+            json.forEach(ex => {
+                //获取问题的文本内容(网页换成文本)
+                ex.problem = extractTextFromHTML(ex.problem);
+                //表格展示文件名称
+                ex.showannex = ex.annex.substr(ex.annex.lastIndexOf('/') + 1);
+                //文件下载路径
+                ex.annex = ex.annex;
+            })
+            //填充表格
+            $('#myTable').datagrid({
+                data: json,
+                //配置项,显示选中行数据
+                onSelect: function (rowIndex, rowData) { 
+                }
+            });
+        }
+        /** 将问题过滤成文本内容*/
+        const extractTextFromHTML = (htmlString) => {
+            const parser = new DOMParser();
+            const doc = parser.parseFromString(htmlString, 'text/html');
+            // 使用 textContent 直接获取所有文本  
+            const textContent = doc.body.textContent || '';
+            return textContent.trim();
+        };
+        /**下载附件 */
+        const downfile = () => {
+            var selectedRow = $('#myTable').datagrid('getSelected');
+            if (selectedRow) { 
+                var a = document.createElement("a");
+                a.href = selectedRow.annex;
+                a.download = selectedRow.annex.substr(selectedRow.annex.lastIndexOf('/') + 1);
+                document.body.appendChild(a);
+                a.click();
+                document.body.removeChild(a);
+            }
+        };
+        /**修改 */
+        const tbReportEdit = () => {
+            var selectedRow = $('#myTable').datagrid('getSelected');
+            if (selectedRow) {
+                parent.window.location.href = 'Richtext.html?id=' + selectedRow.id;
+            }
+        };
+        // 响应式数据:产品型号列表
+        let models = [];
+        /** 获取产品型号 */
+        const getproductmodel = () => {
+            $.get("Richtext.ashx?m=getproductmodel", function (data) {
+                var json = JSON.parse(data);
+                models = json;
+                loadModelsToSelect();
+            })
+        };
+        /** 加载型号到 select 元素中  */
+        const loadModelsToSelect = () => {
+            const select = document.getElementById('modelSelect'); 
+            // 遍历模型数组并添加选项 
+            models.forEach(model => {
+                const option = document.createElement('option');
+                option.value = model.ID;
+                option.textContent = model.GOODSCODE;
+                select.appendChild(option);
+            }); 
+            // 监听选择变化
+            select.addEventListener('change', function () { 
+                read.modelid = this.value;
+            });
+        };
+        /**搜索*/
+        const select = () => { 
+            $.ajax({
+                url: "intelligence.ashx?m=getcontent",
+                type: "POST",
+                data: read,
+                //要传递json时
+                // contentType: "application/json; charset=utf-8",  
+                // data: JSON.stringify(formData),  
+                success: function (data) {
+                    toshow(data);
+                },
+                error: function (xhr, status, error) {
+                    console.error("请求失败: " + error);
+                }
+            });
+            
+        }
+        /**搜索对象 */
+        let read = {
+            /**开始时间*/
+            opentime:'',
+            /**结束时间*/
+            closetime:'',
+            /**项目名称*/
+            name:'',
+            /** 参与人员*/
+            people:'',
+            /**产品型号*/
+            modelid:'' 
+        }
+        // 监听普通文本框的变化  
+        $('#name, #people').on('input', function () {
+            const key = this.id;
+            read[key] = $(this).val();
+        }); 
+        // 监听easyui-datebox的变化  
+        $('#opentime, #closetime').datebox({
+            onChange: function (newValue, oldValue) {
+                const key = this.id;
+                read[key] = newValue; // 或者根据需要转换为字符串  
+            }
+        }); 
+        // 监听easyui-combobox的变化  
+        $('#modelid').combobox({
+            onChange: function (newValue, oldValue) {
+                read.modelid = newValue;
+            }
+        });
+    </script>
+</body>
+</html >