云智博客-blog

云智企业管理信息系统官方博客

nginx在云智系统和云智博客使用

云智系统和博客使用的是阿里云的服务,目前购买了ECS和RDS等服务.

1.ssl证书加载在nginx上,使用的是GeoTrust通配符域名专业版OV SSL证书类型,可对所有的二级域名(*.ciemis.com)域名提供服务

2.启用了http2

3.云智系统(www.ciemis.com)可以使用http和https两种方式访问.云智博客(blog.ciemis.com)只支持https访问,http访问是会自动通过301跳转到https.当然也可以通过javascript进行跳转,代码如下:

var ishttps = 'https:' == document.location.protocol ? true : false;
if (!ishttps) {
    window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
}

4.为了将多个ciemis.com的二级域名绑定到同一台服务器上,我使用了nginx作为反向代理.

www.ciemis.com在IIS上使用的是3017端口,blog.ciemis.com在IIS上使用的是3000端口, 然后在ngnix上配置了反向代理.

当然直接在IIS上绑定主机头也是可行的.

nginx的配置文件节选如下:

#云智
server {
    #监听端口
    listen       80;
    #自己指定要跳转的域名
    server_name  www.ciemis.com;
		        
    #反向代理配置
    location / {
        proxy_pass     http://localhost:3017;
        proxy_set_header   X-Real-IP $remote_addr;
    }
}

server {
    #监听端口
    listen       443 ssl http2;
    #自己指定要跳转的域名
    server_name  www.ciemis.com;
		
    ssl                  on; 
    ssl_certificate   cert/214xxxxxx0803.pem;
    ssl_certificate_key  cert/214xxxxxx0803.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
        
    #反向代理配置
    location / {
        proxy_pass     http://localhost:3017;
        proxy_set_header   X-Real-IP $remote_addr;
    }
}
	
#云智blog
server {
    #监听端口
    listen       80;
    #自己指定要跳转的域名
    server_name  blog.ciemis.com;
		        
    #转向https
    return  301 https://$host;
}
	
server {
    #监听端口
    listen       443 ssl http2;
    #自己指定要跳转的域名
    server_name  blog.ciemis.com;
		
    ssl                  on; 
    ssl_certificate   cert/214xxxxxx0803.pem;
    ssl_certificate_key  cert/214xxxxxx0803.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
        
    #反向代理配置
    location / {
        proxy_pass     http://localhost:3000;
        proxy_set_header   X-Real-IP $remote_addr;
    }
}

附nginx的启动,重启,关闭命令

start nginx #启动nginx

nginx -s reload  #修改配置后重新加载生效
nginx -s reopen  #重新打开日志文件
nginx -t -c /path/to/nginx.conf  #测试nginx配置文件是否正确

#关闭nginx:
nginx -s stop  #快速停止nginx
         quit  #完整有序的停止nginx

 

ChangeLog Version 5.20170607002

1.生产单绑定领料单时,领料单明细中带上生产单明细上的备注信息.
2.无料号采购、销售账单打印
3.替代物料,生产回冲物料时,先按bom明细扣物料,然后按照替代物料的优先级进行扣减
4.增加项目管理中的附件查询
5.修复出入库单的物料查询条件报错
6.改进Bom和自定义报表导出方法
7.修复报验单打印报错,增加报验单导出功能
8.修复新增客户供应商报错
9.修复采购路线查询条件分类报错

SHA-1: 70270ad5e8a3dd477b11f6f05508181adba95d00

云智系统的浏览器IE设置

为了保证系统的运行效率,建议使用win 7,IE9以上软件环境下进行操作.

云智系统直接打印订单时,IE需要调用MS Excel控件进行打印,所以需要对浏览器进行设置,设置方法如下:

1.将云智系统的网站加入到信任站点

打开IE浏览器,点击“工具”菜单中的“Internet选项”,选择“安全”栏,弹出如下任务栏。

点击站点,弹出对话框,输入:*.ciemis.com

2.设置完成后,再点击“Internet选项”对话框“自定义级别”按钮,弹出如下对话框,下拉滚动条至“对未标记为可安全执行的脚本的ActiveX控件初始化并执行脚本”,选择“启用”,点击确认。

工厂不合格品处理流程

工厂不合格品处理流程管理要点

1) 所有待验物料/产品必须当班判定,急需物料需要在2小时内紧急判定。
2) 所有不合格品需在24小时内处理(返工、报废、索赔、让步等)。
3) 必须遵循返工优先的原则,当班或下班需将返工产品完成。
4) 创建返工生产单时如没有物料消耗或部分物料消耗(例打磨、修剪浇口、返工喷涂、小零件复检等)。
5) 判定的不合格品需立即黏贴黄色标识,并隔离至不合格品区域。
6) 判定供应商退货的需立即在系统中做《不合格品退货》操作,并尽快将实物退给供应商。
7) 判定报废的不合格品需立即黏贴红色标识,并尽快将实物做划伤等破坏性操作移至商贸处理区。
8) 报验单是属地化管理(仓储、车间发现疑似不合格均要立即创建报验单请质量人员快速判定)。
9) 报废(计划外出库)可与工作流审批关联。
10) 流程关键执行人:检验员、质量工程师、质量经理、计划员、 生产班组长、仓库班组长。
11) 员工输入缺陷明细不及时或不明确。
12) 生产过程中的不合格品不及时下线,在系统中显示是素材状态,而实物是产成品。
13) 客退产品必须由物流人员将退货单输入系统,自动报验单由检验员迅速判断。

工厂不合格品处理流程

1.采购不合格品处理流程

 1) 收货后自动创建报验单或仓管员手工创建报验单,进料检验员及时判定(当班判定完成,紧急物料2小时内判定),不合格物料进采购不合格库位。
 2) 采购不合格库位库存退给供应商的不合格品退货操作,不合格品退货单提交给对账员。
 3) 未收完的采购单关闭由物料计划员负责关闭。

2.生产不合格品处理流程

2.1 生产不合格品处理-在制品/产成品流程之一

2.2 生产不合格品处理-在制品/产成品流程之二

2.3 生产不合格品处理-外购件/上道工序零件

 1) 车间生产前或过程中发现不合格物料即触发不合格物料报验。
 2) 各生产线班组长创建报验单。
 3) 根据各企业职责分配,班组长或检验员判定报验单。
 4) 判定后不合格物料进入线边不合格库位。
 5) 可退给供应商的不合格物料(料废),从线边不合格库位移库至采购不合格库位,由质量部做不合格退货给供应商。
 6) 需退给上道工序的不合格物料,系统中不用做移库操作,但实物移至相应线边。等待车间和计划员协调返工。
 7) 不能退供应商,也不能返工的物料或上道产品(工废),进行计划外出库报废。

3.客退不合格品处理流程

 1) 有退货单有实物退货,做销售退货。
 2) 自动创建报验单,判定不合格后进入REJ库位(客退不合格库位)。
 3) 可返工客退品从客退不合格库位移库至生产不合格库位。
 4) 需报废客退品在客退不合格品库位内报废,计划外出库。

NPOI在云智系统中的使用

在云智系统中,有许多的数据需要导入到excel,使用微软的office对于web来说要求对服务器的权限过高,所以我使用的第三方的开源软件NPOI.

下面的代码示例就是直接将DataTable转为Excel.表头通过titleArr进行定义.

/// <summary>  
/// 导出Excel  
/// </summary>  
/// <param name="Dt">数据源</param>  
/// <param name="ExcleName">导入文件名称</param>  
/// <param name="SheetName">工作薄名称</param>  
/// <param name="titleArr">标题栏</param>  
/// <param name="clumnArr">栏位名</param>  
public static void ResponseDataSetToExcel(DataTable Dt, string ExcleName, string SheetName, string[] titleArr, string[] clumnArr)
{
    HSSFWorkbook hssfworkbook = new HSSFWorkbook();

    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
    dsi.Company = "Ciemis";
    hssfworkbook.DocumentSummaryInformation = dsi;

    //create a entry of SummaryInformation  
    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    si.Subject = " Export  Excel";
    hssfworkbook.SummaryInformation = si;

    HSSFSheet excelSheet = (HSSFSheet)hssfworkbook.CreateSheet(SheetName);
    int rowCount = 0;
    HSSFRow newRow = (HSSFRow)excelSheet.CreateRow(0);
    rowCount++;
    //循环写出列头           
    for (int i = 0; i < titleArr.Length; i++)
    {
        HSSFCell newCell = (HSSFCell)newRow.CreateCell(i);
        newCell.SetCellValue(titleArr[i]);
    }
    for (int i = 0; i < Dt.Rows.Count; i++)
    {
        rowCount++;
        HSSFRow newRowData = (HSSFRow)excelSheet.CreateRow(rowCount);
        DataRow dr = Dt.Rows[i];
        for (int j = 0; j < clumnArr.Length; j++)
        {
            HSSFCell newCell = (HSSFCell)newRow.CreateCell(rowCount);
            newCell.SetCellValue(dr[titleArr[j]].ToString());
        }
    }

    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
    //避免乱码System.Text.Encoding.UTF8
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(ExcleName, System.Text.Encoding.UTF8));
    HttpContext.Current.Response.Clear();

    MemoryStream file = new MemoryStream();
    hssfworkbook.Write(file);

    HttpContext.Current.Response.BinaryWrite(file.GetBuffer());
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
}

要导出一个DataSet,里面的多个DataTable对应Excel的多个Sheet;

且自动根据数据类型设置Excel的单元格格式.

/// <summary>
/// 导出Excel  
/// </summary>
/// <param name="sourceDs"></param>
/// <param name="fileName">导出的文件名</param>
/// <param name="sheetName">导出的表名,多个表请以逗号(,)分割</param>
public static void ResponseDataSetToExcel(DataSet sourceDs, string fileName, string sheetName = null)
{
    fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8).ToString();

    HSSFWorkbook workbook = new HSSFWorkbook();
    MemoryStream ms = new MemoryStream();
    string[] sheetNames = (sheetName ?? string.Empty).Split(',');
    int length = sourceDs.Tables.Count;
    for (int i = 0; i < length; i++)
    {
        var _sheetName = sheetNames.Length > i ? sheetNames[i] : string.Format("Sheet{0}", i);
        var sheet = workbook.CreateSheet(_sheetName);
        sheet.CreateFreezePane(0, 1, 0, 1);
        //headStyle
        var headStyle = workbook.CreateCellStyle();
        IFont font = workbook.CreateFont();
        font.Boldweight = (short)FontBoldWeight.Bold;
        font.FontHeightInPoints = (short)11;
        font.Color = HSSFColor.Black.Index;
        headStyle.FillBackgroundColor = HSSFColor.Black.Index;
        //headStyle.FillPattern = FillPattern.SolidForeground;
        headStyle.SetFont(font);
        //cellStyleDet
        var cellStyleDet = workbook.CreateCellStyle();
        IFont font1 = workbook.CreateFont();
        font.FontHeightInPoints = (short)10;
        cellStyleDet.SetFont(font1);

        var headerRow = sheet.CreateRow(0);
        // handling header.
        foreach (DataColumn column in sourceDs.Tables[i].Columns)
        {
            var headCell = headerRow.CreateCell(column.Ordinal);
            headCell.SetCellValue(column.ColumnName);
            headCell.CellStyle = headStyle;
        }
        // handling value.
        int rowIndex = 1;
        foreach (DataRow row in sourceDs.Tables[i].Rows)
        {
            var dataRow = sheet.CreateRow(rowIndex);
            foreach (DataColumn column in sourceDs.Tables[i].Columns)
            {
                var detCell = dataRow.CreateCell(column.Ordinal);
                var cellValue = row[column].ToString();
                var type = column.DataType.ToString().ToLower();
                if (row[column] != DBNull.Value)
                {
                    if (type.Contains("decimal") || type.Contains("double") || type.Contains("int"))
                    {
                        detCell.SetCellValue(Convert.ToDouble(row[column]));
                    }
                    else if (type.Contains("datetime"))
                    {
                        detCell.SetCellValue(((DateTime)row[column]).ToString("yyyy-MM-dd HH:mm:ss"));
                    }
                    else
                    {
                        detCell.SetCellValue(row[column].ToString());
                    }
                }
                detCell.CellStyle = cellStyleDet;
            }
            rowIndex++;
        }
    }
    workbook.Write(ms);

    HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
    HttpContext.Current.Response.BinaryWrite(ms.GetBuffer());
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();

    ms.Flush();
    ms.Position = 0;
    ms.Close();
    workbook = null;
    ms = null;
}

如果想对excel进行只读处理,不许对导出的数据进行修改,只需要加入一行代码:

sheet.ProtectSheet("password");